完全を期すために、「いくつかの変数」のケースは実際には可能ですが、エレガントではありません。たとえば、変数のために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では、特に複雑なケースでは非常に自己説明的で効率的であるため、このような構造のコードがますます多く見られます。
1回だけLazy<T>
呼び出すSupplier<T>
が、遅延のクラスと、定義の一貫性Optional<T>
(つまりOptional<T>
- Optional<T>
演算子、またはSupplier<Optional<T>>
)が欠けているのを見逃しています。