gpt4 book ai didi

java - 如何使用java8流结合grouping by语句计算值的总和

转载 作者:行者123 更新时间:2023-11-30 07:04:16 25 4
gpt4 key购买 nike

我有一个包含性别和年龄字段的 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;
}
}
}

上面的代码出现编译错误,如下所示:

Bad return type in method reference: cannot convert double to U. 

它提示steam声明的最后部分Double::sum 。如果我将年龄类型更改为整数并使用 Integer::sum在上面的代码中,它工作得很好。我想知道在这种情况下 Double::sum 有什么问题。

另外,是否可以按性别字段分组并返回Map<Integer, List<Person>>来自一份 Steam 声明?

最佳答案

您遇到了以下两个小问题:(1) 您的身份被解释为整数; (2) 您的 map 的值为 Double(s)。

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

如下所述,您可以使用 Collectors.summingDouble 使其更加简洁且不易出错:

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

关于java - 如何使用java8流结合grouping by语句计算值的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413689/

25 4 0
文章推荐: javascript - 使用 document.getElementsByClassName 添加 css 类
文章推荐: java - 如何在 Java 中的同一个列表中添加多个对象类型
文章推荐: java - 将 ArrayList 转换为 ArrayList 是一种好方法吗?