เพื่อความสมบูรณ์กรณี "ตัวแปรหลายตัว" นั้นเป็นไปได้จริง ๆ แต่ไม่ได้ดูดีเลย ตัวอย่างเช่นสำหรับตัวแปรo
, p
และq
:
Optional.ofNullable( o ).orElseGet(()-> Optional.ofNullable( p ).orElseGet(()-> q ) )
โปรดทราบการใช้งานของorElseGet()
การเข้าร่วมการกรณีที่o
, p
และq
ไม่ได้เป็นตัวแปร แต่การแสดงออกทั้งแพงหรือไม่พึงประสงค์ผลข้างเคียง
ในกรณีทั่วไปมากที่สุด coalesce(e[1],e[2],e[3],...,e[N])
coalesce-expression(i) == e[i] when i = N
coalesce-expression(i) == Optional.ofNullable( e[i] ).orElseGet(()-> coalesce-expression(i+1) ) when i < N
สิ่งนี้สามารถสร้างนิพจน์ที่ยาวเกินไป แต่ถ้าเรามีความพยายามที่จะย้ายไปยังโลกที่ไม่มีnull
แล้วv[i]
เป็นส่วนใหญ่อาจได้จากประเภทนี้เมื่อเทียบกับเพียงOptional<String>
String
ในกรณีนี้,
result= o.orElse(p.orElse(q.get())) ;
หรือในกรณีของนิพจน์:
result= o.orElseGet(()-> p.orElseGet(()-> q.get() ) ) ;
นอกจากนี้หากคุณกำลังจะย้ายไปยังรูปแบบการทำงาน-เปิดเผยo
, p
และq
ควรเป็นชนิดSupplier<String>
เหมือนใน:
Supplier<String> q= ()-> q-expr ;
Supplier<String> p= ()-> Optional.ofNullable(p-expr).orElseGet( q ) ;
Supplier<String> o= ()-> Optional.ofNullable(o-expr).orElseGet( p ) ;
และจากนั้นทั้งหมดcoalesce
ลดลงเพียงเพื่อo.get()
ช่วยลดเพียงเพื่อ
สำหรับตัวอย่างที่เป็นรูปธรรมมากขึ้น:
Supplier<Integer> hardcodedDefaultAge= ()-> 99 ;
Supplier<Integer> defaultAge= ()-> defaultAgeFromDatabase().orElseGet( hardcodedDefaultAge ) ;
Supplier<Integer> ageInStore= ()-> ageFromDatabase(memberId).orElseGet( defaultAge ) ;
Supplier<Integer> effectiveAge= ()-> ageFromInput().orElseGet( ageInStore ) ;
defaultAgeFromDatabase()
, ageFromDatabase()
และageFromInput()
จะกลับมาแล้วOptional<Integer>
เป็นธรรมชาติ
และจากนั้นcoalesce
กลายเป็นeffectiveAge.get()
หรือเพียงแค่effectiveAge
ถ้าเรามีความสุขกับSupplier<Integer>
ถ้าเรามีความสุขกับ
IMHO กับ Java 8 เราจะเห็นโครงสร้างของโค้ดมากขึ้นเรื่อย ๆ เนื่องจากมันอธิบายตัวเองได้ดีและมีประสิทธิภาพในเวลาเดียวกันโดยเฉพาะอย่างยิ่งในกรณีที่ซับซ้อนมากขึ้น
ฉันคิดถึงคลาสLazy<T>
ที่เรียกใช้Supplier<T>
เพียงครั้งเดียว แต่ขี้เกียจรวมถึงความสอดคล้องในคำจำกัดความของOptional<T>
(เช่นOptional<T>
- Optional<T>
โอเปอเรเตอร์หรือแม้แต่Supplier<Optional<T>>
)