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

如何将分数等级判定条件整合到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:48:09