2016-01-21 3 views
1

Есть ли способ, которым я мог бы упростить это и напрямую преобразовать карту, которую я получил из groupingBy, в список элементов, имеющих ключ и значения в качестве атрибутов? И не нужно переводить 2 раза в потоки.groupingBy & Java 8 - после groupingBy преобразовать карту в список объектов

Что я делаю здесь, так это то, что я извлекаю RiskItems, а затем сопоставляю их с DTO, после чего мне они нужны, сгруппированные по атрибуту из RiskItemDTO - RiskDTO, а затем все это в список элементов, имеющих RiskDTO и соответствующие 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

Anything реализация поток мог бы сделать было бы равнозначно делать то же самое, только Скрытие «Карта» от вас. –

ответ

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()); 
Смежные вопросы