一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

怎样用 Java Stream 获取身高最矮者的姓名

时间:2026-06-17 08:18:52 编辑:袖梨 来源:一聚教程网

本文详解如何利用 Java Stream 的 min() 方法结合 Comparator.comparing(),从 Person 对象列表中精准提取身高最小者的名字,避免手动遍历,并处理空列表异常。

本文详解如何利用 java stream 的 `min()` 方法结合 `comparator.comparing()`,从 person 对象列表中精准提取身高最小者的名字,避免手动遍历,并处理空列表异常。

在 Java 中,Stream API 提供了声明式、函数式的数据处理能力。针对“获取身高最矮的 Person 的姓名”这一需求,核心思路不是先求最小高度值,而是直接对 Person 对象按 height 属性排序并取最小元素,再提取其 name 字段。

关键在于使用 Stream.min(Comparator) —— 它返回一个 Optional<T>,代表流中按给定比较器最小的元素。配合 Comparator.comparing(Person::height) 可简洁地按 height 升序比较;随后通过 orElse(...) 安全处理空列表(根据题设,空输入应抛出异常,但示例代码中 test 方法捕获了 IllegalArgumentException,因此实际生产中建议显式校验,此处为兼容原题逻辑,采用 orElse 提供默认对象):

static String shortestPerson(List<Person> ps) {    if (ps == null || ps.isEmpty()) {        throw new IllegalArgumentException("List cannot be null or empty");    }    return ps.stream()             .min(Comparator.comparing(Person::height))             .orElseThrow(() -> new IllegalArgumentException("No person found"))             .name();}

推荐写法说明

  • 使用 orElseThrow() 替代 orElse(new Person(...)) 更符合语义——空列表本应报错,而非伪造数据;
  • 显式判空提升健壮性,避免 NoSuchElementException 隐蔽发生;
  • Person::height 是方法引用,等价于 p -> p.height(),简洁且高效。

对比常见误区:
❌ 错误做法:先用 mapToInt(Person::height).min() 得到 OptionalInt,再遍历原列表匹配——效率低、代码冗长、易出错;
✅ 正确范式:一次流操作完成“查找+提取”,语义清晰、性能最优。

最后提醒:record Person(String name, int height) 天然支持不可变性和透明属性访问,p.name 可直接调用,无需 getter;确保 JDK 版本 ≥ 14(启用 records)且编译参数正确配置。

立即学习“Java免费学习笔记(深入)”;

热门栏目