
本文介绍如何利用 Java Stream API 从 Person 对象列表中高效找出身高最矮者并返回其姓名,重点讲解 min() 与 Comparator.comparing() 的组合用法及空列表的安全处理。
本文介绍如何利用 java stream api 从 person 对象列表中高效找出身高最矮者并返回其姓名,重点讲解 `min()` 与 `comparator.comparing()` 的组合用法及空列表的安全处理。
在 Java 中,使用 Stream 处理集合时,若需基于某个属性(如 height)查找满足条件的对象(如最矮者),不应先提取属性值再比对,而应直接对对象流进行归约操作。核心思路是:将 List
推荐实现如下:
static String shortestPerson(List<person> ps) {
return ps.stream()
.min(Comparator.comparing(Person::height))
.orElseThrow(() -> new IllegalArgumentException("List is empty"))
.name();
}</person>
该写法优于简单 orElse(new Person("No One", 0)),原因在于:
- orElseThrow() 明确表达“空列表应视为非法输入”,与题设中 shortestPerson(List.of()) 抛出 IllegalArgumentException 的测试用例完全一致;
- Person::height 是方法引用,简洁且类型安全,等价于 p -> p.height();
- min() 返回 Optional
,避免空指针风险,强制开发者显式处理边界情况。
⚠️ 注意事项:
- 切勿使用 map(p -> p.height()).min()——这只会返回最小身高数值(int),丢失原始 Person 对象,无法获取 name;
- 不要提前 map(Person::name),否则将失去 height 信息,无法比较;
- Comparator.comparingInt(Person::height) 在性能上略优于 comparing()(避免自动装箱),但对本题可读性影响极小,二者皆可。
完整可运行示例已通过全部测试用例,包括单元素、多元素、边界顺序(如最小值在首/尾/中间)及空列表校验。Stream 的声明式风格不仅代码简洁,更准确表达了业务意图:“找身高最小的人,然后取名字”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











