2016-10-19 104 views
1

有一種方法接收「someObj」,其目的是檢查Set <>類型的變量ASet,遍歷它並將其對象替換爲數據庫對象。爲此我寫了下面的代碼:Java 8可選/功能代碼優化

if(!CollectionUtils.isEmpty(someObj.getASet())){ 
     someObj.setASet(
      someObj.getASet() 
        .stream() 
        .map(c -> AService.getExistingA(c.getId())) 
        .collect(Collectors.toSet()) 
     ); 
    } 

它的目的,但我真的不滿意它的可讀性。

Optional.ofNullable(someObj.getASet()) 
      .ifPresent(ASet-> someObj.setASet(
               ASet.stream() 
               .map(c -> AService.getExistingA(c.getId())) 
               .collect(Collectors.toSet()) 
      )); 

現在它看起來更不可讀,你能推薦一個更好的方法嗎?我認爲最糟糕的問題是,someObj.setASet,它看起來很奇怪,是否有任何功能的方式來取代收集後的對象?

回答

6

嘗試使用Optional.map

Optional.ofNullable(someObj.getASet()) 
     .map(set -> set.stream() 
         .map(c -> AService.getExistingA(c.getId())) 
         .collect(Collectors.toSet())) 
     .ifPresent(set -> someObj.setASet(set)); 

現在,變換邏輯和條件勢在必行「設置的結果」是分開的。

或者,老待機工作過 - 沒有羞恥使用它:

Set set = someObj.getASet(); 
if (set != null) { 
    Set newSet = set.stream() 
        .map(c -> AService.getExistingA(c.getId())) 
        .collect(Collectors.toSet()); 
    someObj.setASet(newSet); 
} 
+0

在我的頭上,將打破,所以我剛纔讀裏面可選的地圖文檔: 如果值存在,適用提供的映射函數給它,如果結果爲非null,則返回一個描述結果的可選項。否則返回一個空的可選。 我愛它,大thx – Als

+3

總是很好的閱讀文檔.... –

+3

但更好的選擇是修復API設計。如果'getASet()'永遠不會返回'null',而只是一個空集,那麼整個'Optional' /條件邏輯就變得不必要了。 – Holger