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)
?
我会为此实现一个决策表.这将是简单的之间的映射Predicate
(其采用输入并返回的功能true
或false
和对应的结果,如果)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)
然后,只是迭代决策表并评估Predicate
s直到找到这样的评估结果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)