完全を期すために、「いくつかの変数」のケースは確かに可能ですが、まったくエレガントではありません。たとえば、変数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>
そして、私たちが a に満足している場合、またはにcoalesce
なります。effectiveAge.get()
effectiveAge
Supplier<Integer>
私見ですが、Java 8 では、このように構造化されたコードがますます多く見られます。これは、特により複雑な場合に、非常に自明であると同時に効率的であるためです。
私は一度だけLazy<T>
a を呼び出すクラスを見逃していますが、怠惰であり、 (つまり、演算子、または さえも) の定義の一貫性があります。Supplier<T>
Optional<T>
Optional<T>
Optional<T>
Supplier<Optional<T>>