Java Stream API 中怎么通过 max 结合 groupingBy 找出每个分类下评分最高的商品

舞夢輝影

舞夢輝影

2026-08-03

858人浏览

原创

用groupingby+collectingandthen+maxby或tomap可获取每类最高分商品:前者需解包optional,后者更简洁;若需保留并列最高分,则用groupingby+tolist+过滤。

java stream api 中怎么通过 max 结合 groupingby 找出每个分类下评分最高的商品

直接用 maxgroupingBy 组合无法一步得到每个分组的“最高分商品”,因为 Collectors.maxBy() 返回的是 Optional<t></t>,而 groupingBy 默认收集的是集合(如 List)。需要搭配 collectingAndThen 或使用 toMap 等更合适的收集器。

用 groupingBy + collectingAndThen + maxBy 获取每个分类的最高分商品

这是最常用也最清晰的方式:先按分类分组,再对每组应用 maxBy,最后用 collectingAndThen 解包 Optional

  • 关键点maxBy(Comparator) 返回 Optional<product></product>,必须用 collectingAndThen 转成非空值(或妥善处理空值)
  • 推荐写法(假设 Productcategoryscore 字段):
Map<string product> topByCategory = products.stream()
    .collect(Collectors.groupingBy(
        Product::getCategory,
        Collectors.collectingAndThen(
            Collectors.maxBy(Comparator.comparingDouble(Product::getScore)),
            optional -> optional.orElse(null) // 或抛异常、提供默认值
        )
    ));</string>

注意:orElse(null) 在某分类无数据时返回 null;生产环境建议用 orElseThrow() 或预判非空。

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

用 toMap 替代 groupingBy 更简洁且避免 Optional

当分组键唯一、且每组只取一个代表元素时,toMapgroupingBy 更直接,天然支持“冲突合并”逻辑。

  • 核心思路:以分类为 key,商品为 value,遇到相同 key 时用比较器选 score 更大的那个
  • 写法示例
Map<string product> topByCategory = products.stream()
    .collect(Collectors.toMap(
        Product::getCategory,
        Function.identity(),
        (p1, p2) -> p1.getScore() >= p2.getScore() ? p1 : p2
    ));</string>

这个版本不依赖 Optional,代码更短,语义更贴近“每类留一个最优”,且自动处理重复 key 的合并逻辑。

如果需要保留所有并列最高分商品,改用 groupingBy + mapping + max

上面两种都只返回一个商品。若某分类有多个商品并列最高分,想全保留,就不能用 maxBy,而要先算出最大分,再筛选:

  • 先分组 → 每组求最大 score → 再映射回匹配该 score 的商品列表
  • 写法略长但语义明确:
Map<string list>> allTopByCategory = products.stream()
    .collect(Collectors.groupingBy(
        Product::getCategory,
        Collectors.collectingAndThen(
            Collectors.toList(),
            list -> {
                double maxScore = list.stream()
                    .mapToDouble(Product::getScore)
                    .max()
                    .orElse(Double.NEGATIVE_INFINITY);
                return list.stream()
                    .filter(p -> p.getScore() == maxScore)
                    .collect(Collectors.toList());
            }
        )
    ));</string>

常见陷阱和注意事项

  • maxBy 在空流时返回 Optional.empty(),直接 get() 会抛 NoSuchElementException
  • toMap 版本要求输入流中每个分类至少有一个商品,否则会因 key 不存在而报错(实际不会,但空流时 map 为空)
  • 比较器要用 Comparator.comparingDouble 处理 double,避免 NullPointerException(如果 score 可能为 null,需额外判空)
  • scoreIntegerLong,用 comparingInt / comparingLong 更高效

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3891

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2861

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2900

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

638

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

728

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1318

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18866

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

647

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 4.1万人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习