在Java中如何使用Collectors.maxBy和minBy获取集合极值_Collectors极值实践指南

浅墨君_3118

浅墨君_3118

2025-11-01

242人浏览

原创

Collectors.maxBy和minBy通过Comparator获取流中最大最小值,返回Optional防止空指针,适用于对象、基本类型及Map结构的极值提取,支持自定义比较逻辑。

在java中如何使用collectors.maxby和minby获取集合极值_collectors极值实践指南

在Java 8引入的Stream API中,Collectors.maxBy 和 Collectors.minBy 是两个非常实用的收集器,用于从流中提取最大值和最小值。它们依赖于Comparator来决定元素之间的排序规则,特别适合处理对象集合中的极值问题。

理解Collectors.maxBy与minBy的基本用法

这两个方法返回的是一个Optional类型的结果,原因是流可能为空,避免空指针异常。它们的定义如下:

  • Collectors.maxBy(Comparator.comparing(...)):获取按指定比较器排序的最大元素
  • Collectors.minBy(Comparator.comparing(...)):获取按指定比较器排序的最小元素

例如,有一个员工列表,想找出工资最高的员工:

List<employee> employees = Arrays.asList(
    new Employee("Alice", 8000),
    new Employee("Bob", 9500),
    new Employee("Charlie", 7000)
);

Optional<employee> highestPaid = employees.stream()
    .collect(Collectors.maxBy(Comparator.comparing(Employee::getSalary)));

highestPaid.ifPresent(emp -> System.out.println("最高工资员工:" + emp.getName()));
</employee></employee>

结合自定义Comparator处理复杂场景

当需要根据多个字段或特定逻辑判断极值时,可以组合Comparator。比如先按工资降序,工资相同时按姓名升序:

Comparator<employee> bySalaryDesc = Comparator.comparing(Employee::getSalary);
Comparator<employee> byNameAsc = Comparator.comparing(Employee::getName);
Comparator<employee> composite = bySalaryDesc.reversed().thenComparing(byNameAsc);

Optional<employee> result = employees.stream()
    .collect(Collectors.minBy(composite));
</employee></employee></employee></employee>

这段代码展示了如何通过链式调用构建复合比较逻辑,并应用于minBy中。

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载

处理基本类型与Map结构中的极值

除了对象列表,也可以用于提取Map中键或值的极值。例如从Map中找到值最大的条目:

Map<string integer> scores = Map.of("数学", 92, "语文", 85, "英语", 96);

Optional<map.entry integer>> maxEntry = scores.entrySet().stream()
    .collect(Collectors.maxBy(Map.Entry.comparingByValue()));

maxEntry.ifPresent(entry -> System.out.println("最高分科目:" + entry.getKey() + "=" + entry.getValue()));
</map.entry></string>

同样,可以用 Map.Entry.comparingByKey() 按键比较。

基本上就这些。只要提供合适的Comparator,maxBy和minBy就能灵活应对各种极值提取需求,是Stream操作中简洁高效的工具。注意始终检查Optional是否为空,避免运行时异常。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java stream

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7039

3

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

379

31

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

2025.11.16

179

10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

670

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

533

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

303

6

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

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

共0课时 | 0人学习