簡體   English   中英

在這種情況下如何避免if-else語句

[英]How to avoid if-else statements in this scenario

我有一個班級成績,其身體如下:

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 ,它將只是Predicate (接受輸入並返回truefalse的函數)與相應結果之間的映射。

請注意,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直到找到評估為truePredicate ,即可為您提供答案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM