如何使用Java 8 Stream查找拥有最低分数的Person对象
Java 8 Stream 实现方案
核心思路是构造自定义比较器,先计算每个Person自身的最低分数,再通过该分数对Person集合排序取最小值即可。
最优实现代码
import java.util.Comparator; import java.util.Optional; // 你的Person集合变量名为personList Optional<Person> personWithMinScore = personList.stream() .min(Comparator.comparingInt(person -> // 计算当前Person的最低分,无有效分数时默认设为最大值,避免干扰正常排序 person.getScores() .stream() .mapToInt(Score::getScore) .min() .orElse(Integer.MAX_VALUE) )); // 若业务场景可保证集合非空且所有Person都有有效分数,可直接获取结果 // Person result = personWithMinScore.get();
代码说明
- 外层流遍历所有
Person实例,通过min方法传入自定义比较规则 - 内层流计算单个
Person的最低分,作为该实例的排序权重 - 内置空安全处理:如果某个
Person的分数集合为空,通过orElse(Integer.MAX_VALUE)将其排序优先级降到最低,不会影响最低分计算结果 - 返回
Optional<Person>规避空指针风险,可根据业务需要选择orElse、orElseThrow等方法获取最终对象
扩展:获取所有持有全局最低分的Person
如果存在多个Person持有相同的全局最低分,需要全部返回时可使用以下写法:
// 第一步:计算全局最低分 int globalMinScore = personList.stream() .flatMap(person -> person.getScores().stream()) .mapToInt(Score::getScore) .min() .orElse(Integer.MAX_VALUE); // 第二步:过滤出所有持有该分数的Person List<Person> personsWithMinScore = personList.stream() .filter(person -> person.getScores() .stream() .anyMatch(score -> score.getScore() == globalMinScore)) .toList();
示例验证
对应你给出的测试数据:
- John的分数集合最低分为4
- David的分数集合最低分为3
执行代码后得到的结果即为David对象,符合需求。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

