如何使用java8 stream结合grouping by语句计算值之和
我有一个Person类,它有性别和年龄字段。我想通过下面的代码得到每个性别的年龄总和如何使用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()
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()));