2016-01-21 74 views
1

有沒有一種方法可以簡化這一點,並直接將我從groupingBy獲得的映射轉換爲具有鍵和值作爲屬性的元素列表?而不是有2次轉換流。groupingBy&Java 8 - 分組後通過將地圖轉換爲對象列表

我在這裏做的是,我獲取RiskItems,然後將它們映射到DTO,之後我需要它們按RiskItemDTO中的一個屬性 - RiskDTO分組,然後將所有這些轉換爲具有RiskDTO和coreSponding RiskItemDTOs的核心元素列表作爲元素。

riskItemRepositoryCustom.findRiskItemsByRiskTypeName(riskTypeName) 
      .stream() 
      .map(mapper::mapToDTO) 
      .collect(groupingBy(RiskItemDTO::getRisk)) 
      .entrySet() 
      .stream() 
      .map(entry -> new RiskWithRiskItemsDTO(entry.getKey(),entry.getValue())) 
      .collect(Collectors.toList()); 
+2

任何流實施能做的只是相當於做同樣的事情,只是隱藏來自你的「地圖」。 –

回答

6

不,這是兩個獨立的流操作;分組的結果是第二個管道的輸入。

我知道很多人試圖用「儘量少用分號」來製作遊戲,但目標應該是可讀性和清晰度,而不是簡潔。在一般情況下,我覺得這是更好地誠實面對正在發生的事情,並把它寫入作爲兩個獨立的流操作:

Map<RiskItemDTO, List<RiskItem> itemsByRisk = repo.findRiskItemsByRiskTypeName(riskTypeName) 
     .stream() 
     .map(mapper::mapToDTO) 
     .collect(groupingBy(RiskItemDTO::getRisk)); 

List<RiskWithRiskItemsDTO> list = itemsByRisk.entrySet().stream() 
     .map(entry -> new RiskWithRiskItemsDTO(entry.getKey(),entry.getValue())) 
     .collect(Collectors.toList());