如何将分数等级判定条件整合到Java Stream处理逻辑中
能否将分数等级判断逻辑直接整合到Stream处理流程中
现有实现
以下是当前的实现代码:
public String marks(Double d){ if (d>90) return "A"; else if (90>=d&&d>=83) return "B"; else if (83>d&&d>=75) return "C"; else if (75>d&&d>=68) return "D"; else if (68>d&&d>=60) return "E"; else return "F"; } public Map<Person, String> defineMarks(Stream<CourseResult> results) { return results.collect(Collectors.toMap(CourseResult::getPerson,x->marks(x.getTaskResults().values().stream().mapToDouble(Integer::doubleValue).average().orElse(0)))); }
参考用的CourseResult类定义如下:
public class CourseResult { private final Person person; private final Map<String, Integer> taskResults; public CourseResult(final Person person, final Map<String, Integer> taskResults) { this.person = person; this.taskResults = taskResults; } public Person getPerson() { return person; } public Map<String, Integer> getTaskResults() { return taskResults; } }
目前defineMarks方法会返回人员与其对应分数等级的映射集合,希望不单独定义marks方法,直接把分数区间判断逻辑整合到Stream流程中实现相同功能。
解答
完全可以,不需要单独定义独立的marks方法,两种实现都和原有逻辑完全等价,可按需选择:
- 嵌套三元表达式写法(最紧凑)
三元表达式是顺序短路判断的,走到后续分支时天然不满足前序分支的条件,因此不需要重复写区间上限判断,直接内联到值映射位置即可:public Map<Person, String> defineMarks(Stream<CourseResult> results) { return results.collect(Collectors.toMap( CourseResult::getPerson, x -> { double avg = x.getTaskResults().values().stream() .mapToDouble(Integer::doubleValue) .average() .orElse(0); return avg > 90 ? "A" : avg >= 83 ? "B" : avg >= 75 ? "C" : avg >= 68 ? "D" : avg >= 60 ? "E" : "F"; } )); } - 块级lambda写if-else(可读性最好)
如果不习惯三元嵌套的写法,直接在lambda的代码块中编写原有的if-else判断即可,逻辑和原marks方法几乎一致,不需要抽成独立方法:public Map<Person, String> defineMarks(Stream<CourseResult> results) { return results.collect(Collectors.toMap( CourseResult::getPerson, x -> { double avg = x.getTaskResults().values().stream() .mapToDouble(Integer::doubleValue) .average() .orElse(0); if (avg > 90) return "A"; if (avg >= 83) return "B"; if (avg >= 75) return "C"; if (avg >= 68) return "D"; if (avg >= 60) return "E"; return "F"; } )); }
两种写法都完整保留了原代码的平均分计算规则、等级划分区间,返回结果和原实现没有任何差异。
内容的提问来源于stack exchange,提问作者fireballun
相关产品推荐
相关产品推荐

