#java #java-stream
#java #java-stream
Вопрос:
Для группировки и вычисления суммы я использую конструкцию
public class Test {
public static void main(String[] args) {
List<SomeClass> list = new ArrayList<>();
list.add(new SomeClass("Someone", 3, 2));
list.add(new SomeClass("AnotherOne", 4, 6));
list.add(new SomeClass("Someone", 1, 4));
Map<String, Integer> someones = list.stream()
.collect(Collectors.toMap
e -> e.name,
e -> e.field1 e.field2,
Integer::sum,
LinkedHashMap::new));
System.out.println(someones); // {Someone=10, AnotherOne=10}
}
}
public class SomeClass {
String name;
int field1;
int field2;
public SomeClass(String name, int field1, int field2) {
this.name = name;
this.field1 = field1;
this.field2 = field2;
}
}
как я могу привести ответ к форме [SomeClass ("Someone", field1 = 4, field2 = 6), SomeClass ("AnotherOne", field1 = 4, field2 = 6)]
, то есть суммировать field1
и field1
с общим именем группировать по name
и выводить в List
Комментарии:
1.
e -> e
(илиFunction.identity()
) для извлечения значений,(e1, e2) -> new SomeClass(e1.name, e1.field1 e2.field1, e1.field2 e2.field2)
для слияния. Это то, что вы ищете? Это даст вамMap<String, SomeClass>
.2. это помогло, спасибо!!!
Ответ №1:
Попробуйте Collectors.groupingBy
Map<String, Integer> collect = list.stream()
.collect(Collectors.groupingBy(SomeClass::getName,
Collectors.summingInt(e -> e.getField1() e.getField2())));
Комментарии:
1. и как это приведет к желаемому результату, упомянутому в вопросе?