Tam olması için, "çok değişkenli" durum gerçekten de mümkün olmasa da mümkün. Örneğin, değişkenlerin o, pve q:
Optional.ofNullable( o ).orElseGet(()-> Optional.ofNullable( p ).orElseGet(()-> q ) )
Dikkatini çekerim orElseGet()bakılırken o, pve qdeğişkenler ancak ifadeleri pahalı ya da istenmeyen yan etkiler ile ya da değildir.
En genel durumda 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
Bu, aşırı uzun ifadeler üretebilir. Onsuz bir dünyaya taşımak için çalışıyoruz Ancak, nulldaha sonra v[i]büyük olasılıkla zaten türdedir Optional<String>basitçe aksine, String. Bu durumda,
result= o.orElse(p.orElse(q.get())) ;
veya ifadeler söz konusu olduğunda:
result= o.orElseGet(()-> p.orElseGet(()-> q.get() ) ) ;
Ayrıca fonksiyonel-bildirge stiline hareket ediyor Dahası, eğer o, pve qtipte olmalıdır Supplier<String>gibi:
Supplier<String> q= ()-> q-expr ;
Supplier<String> p= ()-> Optional.ofNullable(p-expr).orElseGet( q ) ;
Supplier<String> o= ()-> Optional.ofNullable(o-expr).orElseGet( p ) ;
Ve sonra bütün coalescebasitçe azalır o.get().
Daha somut bir örnek için:
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()ve ageFromInput()zaten Optional<Integer>doğal olarak geri dönecekti .
Ve sonra coalesceolur effectiveAge.get()ya da sadece bir effectiveAgeile mutlu olursak Supplier<Integer>.
IMHO, Java 8 ile daha fazla kodun bu şekilde yapılandırıldığını göreceğiz, çünkü aynı zamanda son derece açıklayıcı ve verimli, özellikle daha karmaşık durumlarda.
Ben sadece bir kez, ama tembel olarak, yanı sıra (yani - operatörler, hatta ) tanımında tutarlılık Lazy<T>çağıran bir sınıf özledim .Supplier<T>Optional<T>Optional<T>Optional<T>Supplier<Optional<T>>