2017-04-04 6 views
5
public ValueA map(ValueB valueB, Date date) { 
    Optional<ValueC> valueCOpt = find(valueB); 
    if (valueCOpt.isPresent()) { 
     ValueC valueC = valueCOpt.get(); 
     // call many getters on valueC and do a lot of logic with it. 
     return map(/*some parameters*/); 
    } 
    return null; 
} 

이것은 상당히 추한 것 같습니다. optionals의 장점은 완전히 여기에있다. 나는 get 대신 map 또는 flatMap을 사용해야한다고 읽었습니다. 내가Optional.get 및 Optional.isPresent 사용을 피하는 방법

valueCOpt.map(ValueC::getFieldA) 

valueC.getFieldA() 

같은 모든 게터는 여기에 몇 가지 일반적인 또는 모범 사례를 알아 교체한다면 그것은 정말 이득이다? 당신은 예외

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC)) 
     .orElse(null); 

OrElse라는를 (필요한 경우

+3

https://www.youtube.com/watch?v=Ej0sss6cq14 – Eugene

답변

7

당신은 선택이 비어 있지 않은 경우 키 포인트는 매핑 기능은 평가되어 있는지, 그렇지 않으면 결과는 선택적 빈을 유지한다

public ValueA map(ValueB valueB, Date date) { 
    return find(valueB) 
     .map(valueC -> { 
      // call many getters on valueC and do a lot of logic with it. 
      return map(/*some parameters*/); 
     }) 
     .orElse(null); 
} 

사용할 수 있습니다 . orElse(null)은 비어있는 경우 null을 반환합니다.

+1

그리고 다시 ... 아주 빠릅니다. – Eugene

+1

좋습니다. 추가 리팩터링은 null을 반환하지 않지만 비어있는 옵션을 반환하는 것입니다. 그런 다음 쓸 수 있습니다 : find (valueB) .map (valueC -> { // valueC에 많은 getter를 호출하고 많은 논리를 사용합니다.) return map (/ * some parameters * /);}); 즉 :'. orElse (null)'이 필요 없습니다. – Chris311

+0

''map (/ * some parameters * /);})'옵션을 반환하면'find (valueB) .flatMap (valueC -> map (...))'을 대신 사용할 수 있습니다. –

3

당신이 필요로하면 디폴트 값을 필요로 할 때이 경우 그 null에 사용), 매핑 다음 OrElse라는(), 또는 orElseThrow()이다