我有一个班级成绩,其身体如下:
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));
}
}
和一个枚举类:
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;
}
}
调用
getGrades(int marks)
时如何避免if else结构? 最佳答案
我将为此制定一个决策表。如果将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);
}};
然后,只需迭代决策表并评估
Predicate
直到找到被评估为true
的值,都应该为您提供答案:for (Entry<Predicate<Integer>, Grade> entry : table.entrySet()) {
if (entry.getKey().test(marks)) {
return entry.getValue();
}
}
return Grade.GREATEST;
关于java - 在这种情况下如何避免if-else语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37609173/