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
, p
ve q
:
Optional.ofNullable( o ).orElseGet(()-> Optional.ofNullable( p ).orElseGet(()-> q ) )
Dikkatini çekerim orElseGet()
bakılırken o
, p
ve q
değ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, null
daha 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
, p
ve q
tipte 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 coalesce
basitç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 coalesce
olur effectiveAge.get()
ya da sadece bir effectiveAge
ile 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>>