पूर्णता के लिए, "कई चर" मामला वास्तव में संभव है, हालांकि यह बिल्कुल भी सुरुचिपूर्ण नहीं है। उदाहरण के लिए, चर के लिए 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>>
) की परिभाषा में स्थिरता ।