Как рассчитать кратную сумму в группировке объектов по свойству в потоке Java8? - PullRequest
1 голос
/ 04 апреля 2019

Я делаю некоторые расчеты с некоторыми данными.Объект имеет несколько числовых свойств.Я добился расчета группировки по типу по одному свойству.Но нужно рассчитать по каждому числовому значению.Итак, есть ли способ решить эту проблему?

Person p1 = new Person("p1","type1",18,3);
Person p2 = new Person("p2","type2",10,6);
Person p3 = new Person("p3","type1",5,8);

List<Person> personList = new ArrayList<>();
personList.add(p1);
personList.add(p2);
personList.add(p3);

Map<String, Integer> collect = 
        personList.stream().collect(
            Collectors.groupingBy(
                Person::getType,Collectors.summingInt(Person::getAge)
            )
        );

Я ожидаю сумму каждого свойства и одну карту результата.Значением карты является карта / массив / список.Например:

type1 [23,11]
type2 [10,6]

1 Ответ

1 голос
/ 04 апреля 2019

Как указано в комментариях, здесь важно определить тип вашего вывода.Чтобы добавить суть того, как вы планируете это сделать, вы можете использовать Collectors.toMap с пользовательским mergeFunction как:

List<Person> personList = new ArrayList<>();
Map<String, Person> collect = personList.stream()
        .collect(Collectors.toMap(Person::getType, a -> a, (p1, p2) ->
                new Person(p1.getX(), p1.getType(),
                        p1.getAge() + p2.getAge(),
                        p1.getCode() + p2.getCode()))); // named the other attribute 'code'

Теперь, против каждого type у вас есть объект Person с целочисленные значения.

...