รูปแบบ Optional
ของ Guava นั้นยอดเยี่ยม เนื่องจากช่วยขจัดความคลุมเครือที่เป็นโมฆะ เมธอด transform
มีประโยชน์มากสำหรับการสร้างกลุ่มเมธอดแบบ null-safe เมื่อส่วนแรกของเชนอาจหายไป แต่ไม่มีประโยชน์เมื่อส่วนอื่นๆ ของเชนหายไป
คำถามนี้เกี่ยวข้องกับ Guava Optional type เมื่อการแปลงส่งกลับ Optional อื่น ซึ่งถามคำถามเดียวกันเป็นหลัก แต่สำหรับกรณีการใช้งานอื่นซึ่งฉันคิดว่าอาจไม่ใช่การใช้งานที่ตั้งใจไว้ของ Optional
(การจัดการข้อผิดพลาด)
พิจารณาวิธีการ Optional<Book> findBook(String id)
findBook(id).transform(Book.getName)
ทำงานได้ตามที่คาดไว้ หากไม่พบหนังสือ เราจะได้ Absent<String>
หากพบหนังสือ เราจะได้ Present<String>
ในกรณีทั่วไปที่วิธีการระดับกลางอาจส่งคืน null
/absent()
ดูเหมือนจะไม่มีวิธีที่ดีในการโยงสาย ตัวอย่างเช่น สมมติว่า Book
มีเมธอด Optional<Publisher> getPublisher()
และเราต้องการรับหนังสือทั้งหมดที่จัดพิมพ์โดยผู้จัดพิมพ์หนังสือ ไวยากรณ์ตามธรรมชาติดูเหมือนจะเป็น findBook(id).transform(Book.getPublisher).transform(Publisher.getPublishedBooks)
อย่างไรก็ตาม สิ่งนี้จะล้มเหลวเนื่องจากการเรียก transform(Publisher.getPublishedBooks)
จะส่งกลับ Optional<Optional<Publisher>>
จริงๆ
ดูเหมือนสมเหตุสมผลพอสมควรที่จะมีเมธอด transform()
-like บน Optional
ที่จะยอมรับฟังก์ชันที่ส่งคืน Optional
มันจะทำหน้าที่เหมือนการใช้งานปัจจุบันทุกประการ ยกเว้นว่าจะไม่รวมผลลัพธ์ของฟังก์ชันไว้ในตัวเลือก การใช้งาน (สำหรับ Present
) อาจอ่านได้:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
return function.apply(reference);
}
การใช้งานสำหรับ Absent
ไม่มีการเปลี่ยนแปลงจาก transform
:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
checkNotNull(function);
return Optional.absent();
}
คงจะดีไม่น้อยหากมีวิธีจัดการกับเมธอดที่ส่งคืน null
ซึ่งต่างจาก Optional
สำหรับการทำงานกับออบเจ็กต์ดั้งเดิม วิธีการดังกล่าวจะเป็นเช่น transform
แต่เพียงแค่เรียก Optional.fromNullable
ตามผลลัพธ์ของฟังก์ชัน
ฉันอยากรู้ว่ามีใครพบปัญหานี้หรือไม่และพบวิธีแก้ปัญหาที่ดี (ซึ่งไม่เกี่ยวข้องกับการเขียนคลาส Optional
ของคุณเอง) ฉันยังอยากได้ยินจากทีม Guava หรือให้พูดถึงการสนทนาที่เกี่ยวข้องกับปัญหานี้ด้วย (ฉันไม่พบสิ่งใดในการค้นหาของฉัน)