Java Spring中如何通过stream或foreach获取ArrayList里answerOption的最大score值
Java Stream获取AnswerOption最大score实现方案
原有代码问题
你之前的写法无效果是因为Stream.max()仅返回Optional<AnswerOption>类型的结果,你在forEach逻辑中仅触发了最大值计算,但没有接收结果、也没有执行后续的查库和字段替换逻辑,计算结果被直接丢弃。
实现方案
场景1:每个Answer下取最大score的AnswerOption,分别替换
适合你需要对每个answer下的选项单独处理、逐个替换的需求:
input.getQuestionnaire().getQuestion().stream() .forEach(question -> question.getAnswer().forEach(answer -> { // 取当前Answer下score最高的AnswerOption AnswerOption maxScoreOption = answer.getAnswerOption().stream() .max(Comparator.comparingInt(AnswerOption::getScore)) // 处理AnswerOption为空的异常场景,允许空可替换为orElse(null) .orElseThrow(() -> new IllegalArgumentException("当前答案下无有效选项")); // 此处替换为你的数据库查询逻辑 AnswerOption dbOption = yourMapper.selectByAnswerId(maxScoreOption.getAnswerId()); // 替换原Answer的answerOption字段为数据库查询结果 answer.setAnswerOption(Collections.singletonList(dbOption)); }));
场景2:全局所有AnswerOption中取最大score的单个对象
适合你需要取所有选项里最高score的单条数据处理的需求:
AnswerOption globalMaxOption = input.getQuestionnaire().getQuestion().stream() .flatMap(question -> question.getAnswer().stream()) .flatMap(answer -> answer.getAnswerOption().stream()) .max(Comparator.comparingInt(AnswerOption::getScore)) .orElseThrow(() -> new IllegalArgumentException("无有效答案选项")); // 后续查库、替换逻辑和场景1一致
注意事项
- 使用
Comparator.comparingInt代替Comparator.comparing可避免自动拆箱开销,性能更优 - 若业务允许
answerOption为空,可将orElseThrow替换为orElse(默认对象)自行处理空场景 - 替换字段时用
Collections.singletonList包裹查询结果,可匹配你原有结构中answerOption为数组的格式要求
内容的提问来源于stack exchange,提问作者winterfell
相关产品推荐
相关产品推荐

