如何避免此场景中的if-else语句

Dri*_*ens 1 java enums if-statement

我有一个具有以下身体的班级成绩:

public class Grades {

    public static Grade getGrades(int marks) {
        if (marks < 10) {
            return Grade.FAILED;
        } else if (marks < 13) {
            return Grade.DISTINCTION;
        } else if (marks < 15) {
            return Grade.GREAT;
        } else {
            return Grade.GREATEST;
        }
    }

    public static void main(String args[]){
        System.out.println(getGrades(6));
    }
}
Run Code Online (Sandbox Code Playgroud)

和枚举类:

public enum Grade {

    FAILED("F"),
    DISTINCTION("D"),
    GREAT("G"),
    GREATEST("G");


    private String code;

    Grade(String code){
        this.code = code;
    }

    public String getCode() {
        return code;
    }

}
Run Code Online (Sandbox Code Playgroud)

我怎么能在打电话时避免使用if else构造getGrades(int marks)

Kon*_*kov 6

我会为此实现一个决策表.这将是简单的之间的映射Predicate(其采用输入并返回的功能truefalse和对应的结果,如果)Predicate进行评估,以true.

请注意,Java8引入了Predicate<T>界面,这在您的情况下可能非常有用.此外,它可以表示为lambda,这将减少代码的冗长.

所以你有:

Map<Predicate<Integer>, Grade> table = new LinkedHashMap<Predicate<Integer>, Grade>() {{
      put (x -> x < 10, Grade.FAILED);
      put (x -> x < 13, Grade.DISTINCTION);
      put (x -> x < 15, Grade.GREAT);
}};
Run Code Online (Sandbox Code Playgroud)

然后,只是迭代决策表并评估Predicates直到找到这样的评估结果true,应该给你答案:

for (Entry<Predicate<Integer>, Grade> entry : table.entrySet()) {
    if (entry.getKey().test(marks)) {
        return entry.getValue();
    }
}
return Grade.GREATEST;
Run Code Online (Sandbox Code Playgroud)