在Java8流中,如何通过属性计算对象分组中的多个和?

在Java8流中,如何通过属性计算对象分组中的多个和?,java,java-8,java-stream,Java,Java 8,Java Stream,我正在用一些数据做一些计算。该对象具有多个数值属性。我已经实现了按一个属性的类型计算分组。但需要计算每个数值。那么,有什么方法可以解决这个问题呢 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<

我正在用一些数据做一些计算。该对象具有多个数值属性。我已经实现了按一个属性的类型计算分组。但需要计算每个数值。那么,有什么方法可以解决这个问题呢

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)
            )
        );

正如在评论中指出的,在这里定义输出的类型很重要。要添加计划如何执行此操作的要点,您可以将
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'
List personList=new ArrayList();
Map collect=personList.stream()
.collect(Collectors.toMap(Person::getType,a->a,(p1,p2)->
新人(p1.getX(),p1.getType(),
p1.getAge()+p2.getAge(),
p1.getCode()+p2.getCode());//将另一个属性命名为“code”

现在,针对每个
类型
都有一个
Person
对象,该对象的整数值相加。

一个重要的部分是定义这样一个映射的类型。第二个属性的名称是什么?
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'