2017-04-04 144 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; 
} 

這似乎相當難看。可選項的優點完全消失在這裏。我讀到,應該使用mapflatMap而不是get。但它是一個真正的好處,如果我喜歡更換如何避免使用Optional.get和Optional.isPresent

valueC.getFieldA() 

每個獲取方法,

valueCOpt.map(ValueC::getFieldA) 

你知道一些常用的或最好的做法在這裏?

+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

@ Chris311 if map(/ * some parameters * /);})'返回一個可選的,那麼你可以使用'find(valueB).flatMap(valueC - > map(...))' –

3

你需要的是映射,那麼否則容易(),或orElseThrow()如果你需要一個例外

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

否則容易()當您需要使用默認值,在這種情況下,它null