Поток собирает группировку путем настройки вывода

#java #stream #java-stream #collectors

#java #поток #java-поток #сборщики

Вопрос:

У меня есть класс JAVA, описанный ниже:

 public class Hello {
   
   public String field1;
   public String field2;
   public String field3;

}
  

Теперь у меня есть list несколько Hello объектов, я хочу сгруппировать элемент списка по field1 . Моя проблема в том, что я хочу иметь только набор field3 сгруппированных элементов, а не все Hello поля объекта.

Например, в качестве выходных данных я хочу получить карту:

 field1Value1 -> [field3Value1, field3Value2, field3Value3]
field1Value2 -> [field3Value4, field3Value5, field3Value6]
  

Конечно, я пытался сделать это с помощью steam:

 HelloList.stream.collect(Collectors.groupingBy(Hello::field1, Collectors.toSet()));
  

Как и выше, я получу набор Hello объектов, отображаемых field1 , к сожалению, это не то, что я хочу.

Комментарии:

1. по крайней мере, для меня не совсем ясно, чего вы хотите, можете ли вы изменить вопрос с помощью какого-либо примера

2. В выходной карте я хочу, чтобы ключом было поле 1, а в качестве значения — набор полей 3.

Ответ №1:

Я думаю, вы ищете Collectors.mapping :

 helloList.stream()
    .collect(groupingBy(Hello::field1, mapping(Hello::field3, toSet())));
  

В общем, неплохо иметь Javadoc для Collectors удобства, потому что существует ряд полезных операций компоновки (таких как этот mapping и обратный ему collectingAndThen ), и их достаточно, чтобы, когда у вас возник подобный вопрос, полезно просмотреть список, чтобы найти подходящий инструмент.

Комментарии:

1. Это работает, спасибо. Я собираюсь принять во внимание ваш совет.