완전 함을 위해서, "여러 변수"사례는 실제로 가능하지만 전혀 우아하지는 않습니다. 예를 들어, 변수 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에서는 특히 더 복잡한 경우에 매우 자기 설명적이고 효율적이기 때문에 이와 같이 더 많은 코드가 이와 같이 구조화됩니다.
나는 단 한 번만 Lazy<T>
호출 Supplier<T>
하지만 게으르게 클래스 의 정의 Optional<T>
(예 Optional<T>
: Optional<T>
연산자 또는 심지어 Supplier<Optional<T>>
) 를 일관성있게 호출합니다 .