You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:15:05