#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. Это работает, спасибо. Я собираюсь принять во внимание ваш совет.