仅出于完整性考虑,“几个变量”的情况确实是可能的,尽管一点也不优雅。例如,对于变量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>
。
恕我直言,使用Java 8时,我们将看到越来越多的这样的代码结构,因为它同时具有极强的自我解释性和效率,尤其是在更复杂的情况下。
我确实错过了只Lazy<T>
调用Supplier<T>
一次但懒惰的类以及Optional<T>
(例如Optional<T>
- Optional<T>
运算符,甚至Supplier<Optional<T>>
)定义的一致性。