如何使用java8 stream结合grouping by语句计算值之和

如何使用java8 stream结合grouping by语句计算值之和,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个Person类,它有性别和年龄字段。我想通过下面的代码得到每个性别的年龄总和 public void test() { List<Person> roster = new ArrayList(); Map<Integer, Integer> totalAgeByGender = roster .stream()

我有一个Person类,它有性别和年龄字段。我想通过下面的代码得到每个性别的年龄总和

public void test() {
        List<Person> roster = new ArrayList();

        Map<Integer, Integer> totalAgeByGender =
                roster
                        .stream()
                        .collect(
                                Collectors.groupingBy(
                                        Person::getGender,
                                        Collectors.reducing(
                                                0,
                                                Person::getAge,
                                                Double::sum)));
    }

    static class Person {

        private int gender;
        private double age;

        public int getGender() {
            return gender;
        }

        public double getAge() {
            return age;
        }
    }
}
它抱怨steam语句的最后一部分
Double::sum
。如果我将age的类型更改为integer,并在上面的代码中使用
integer::sum
,它就可以正常工作。在这种情况下,我不知道Double::sum有什么问题


此外,是否可以按性别字段分组并从一个steam语句返回
Map

这里有以下两个小问题:(1)您的标识被解释为整数;(2)地图的值是双(s)

Map totalAgeByGender=//不映射
花名册
.collect(收集器.groupingBy(
Person::getGender,
还原剂(
0d,//不是0
人物:getAge,
(双重:总和),;
如下所述,您可以使用Collectors.summingDouble使其更简洁、更不容易出错:

Map<Integer, Double> totalAgeByGender = roster.stream()
    .collect(Collectors.groupingBy(
        Person::getGender,
        Collectors.summingDouble(Person::getAge)));
Map totalAgeByGender=花名册.stream()
.collect(收集器.groupingBy(
Person::getGender,
收集器。总和加倍(Person::getAge));
你可以很容易地按性别分组:

Map<Integer, List<Person>> sexToPeople = roster.stream()
    .collect(Collectors.groupingBy(
        Person::getGender, 
        Collectors.toList()));
Map sextople=花名册.stream()
.collect(收集器.groupingBy(
Person::getGender,
收藏家;

收集器。summingDouble(Person::getAge)
更简洁。
Map<Integer, Double> totalAgeByGender = roster.stream()
    .collect(Collectors.groupingBy(
        Person::getGender,
        Collectors.summingDouble(Person::getAge)));
Map<Integer, List<Person>> sexToPeople = roster.stream()
    .collect(Collectors.groupingBy(
        Person::getGender, 
        Collectors.toList()));