2016-01-21 28 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());