Группировка API потоков

#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. и как это приведет к желаемому результату, упомянутому в вопросе?