पूर्णता के लिए, "कई चर" मामला वास्तव में संभव है, हालांकि यह बिल्कुल भी सुरुचिपूर्ण नहीं है। उदाहरण के लिए, चर के लिए 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, जावा 8 के साथ हम अधिक से अधिक कोड को इस तरह संरचित देखेंगे, क्योंकि यह एक ही समय में बेहद आत्म-व्याख्यात्मक और कुशल है, विशेष रूप से अधिक जटिल मामलों में।
मुझे एक ऐसा वर्ग याद आता है Lazy<T>जो Supplier<T>केवल एक बार ही आह्वान करता है , लेकिन आलसी, साथ ही Optional<T>(यानी Optional<T>- Optional<T>ऑपरेटरों, या यहां तक कि Supplier<Optional<T>>) की परिभाषा में स्थिरता ।