gpt4 book ai didi

Java 8 Stream API - 仅选择 Collectors.groupingBy(..) 之后的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:26:38 25 4
gpt4 key购买 nike

假设我有以下 Student 对象集合,其中包含 Name(String)、Age(int) 和 City(String)。

我正在尝试使用 Java 的 Stream API 来实现以下类似 sql 的行为:

SELECT MAX(age)
FROM Students
GROUP BY city

现在,我找到了两种不同的方法:

final List<Integer> variation1 =
students.stream()
.collect(Collectors.groupingBy(Student::getCity, Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge())))
.values()
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.map(Student::getAge)
.collect(Collectors.toList());

还有一个:

final Collection<Integer> variation2 =
students.stream()
.collect(Collectors.groupingBy(Student::getCity,
Collectors.collectingAndThen(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge()),
optional -> optional.get().getAge())))
.values();

在这两种方式中,都必须 .values() ... 并过滤从收集器返回的空组。

是否有任何其他方法可以实现此要求的行为?

这些方法让我想起了over partition by sql语句...

谢谢


编辑: 下面的所有答案都非常有趣,但不幸的是这不是我要找的,因为我试图得到的只是值。我不需要键,只需要值。

最佳答案

不要总是坚持使用 groupingBy。有时 toMap 是您需要的东西:

Collection<Integer> result = students.stream()
.collect(Collectors.toMap(Student::getCity, Student::getAge, Integer::max))
.values();

在这里,您只需创建一个 Map,其中键是城市,值是年龄。如果几个学生在同一个城市,则使用合并功能,这里只选择最大年龄。它更快、更清洁。

关于Java 8 Stream API - 仅选择 Collectors.groupingBy(..) 之后的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35710619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com