簡體   English   中英

Java 比較值,最好的方法

[英]Java compare values, best way

我有這樣的方法

private boolean validGrade(final StringBuilder grade) {
   boolean isValid = false;
   String semester = "semester"; 

   if ((grade.toString().contains("2o") && grade.toString().contains(semester))
                    || (grade.toString().contains("4o") && grade.toString().contains(semester))
                    || (grade.toString().contains("6o") && grade.toString().contains(semester))
                    || (grade.toString().contains("8o") && grade.toString().contains(semester))) {
    isValid = true;
            }
    }

我想用這樣的東西替換它:

private boolean doValidGradoAntComp(final StringBuilder grade) {
        boolean isValid = false;

        switch (grade.toString()) {
        case "2o semester":
            isValid = true;
            break;
        case "4o semester":
            isValid = true;
            break;
        case "6o semester":
            isValid = true;
            break;
        case "8o semester":
            isValid = true;
            break;
        default:
            break;
        }

        return isValid;
    }

我的疑問是:哪個更好? 兩者的工作方式相同?

不,這兩種方法都不同,在第一種方法中,您使用contains來檢查grade中存在的兩個字符串(例如2osemester in grade )。 但是在第二個方法中,您檢查的grade等於2o semester 我更喜歡收集所有這些以列出和使用anyMatch

List<String> list = List.of("2o","4o","6o","8o");

if(list.stream().anyMatch(val->grade.contains(val) && grade.contains(semester))) {

為什么不迭代可能性?

private boolean validGrade(final StringBuilder grade) {
    String gradeString = grade.toString();
    return List.of("2o", "4o", "6o", "8o")
        .stream()
        .map(x -> x + " semester")
        .collect(Collectors.toSet())
        .contains(gradeString);
}

或者,如果您不是在尋找完全匹配,請執行以下操作:

private boolean validGrade(final StringBuilder grade) {
    String gradeString = grade.toString();
    return gradeString.contains("semester") && List.of("2o", "4o", "6o", "8o")
        .stream()
        .anyMatch(gradeString::contains);
}

最后,如果您的匹配集不靈活(始終是"2o", "4o", "6o", "8o" ),那么您可以只使用正則表達式:

private boolean validGrade(final StringBuilder grade) {
    return grade.toString().matches("[2468]o semester"); //exact match
//  return grade.toString().matches("[2468]o.*semester|semester.*[2468]o"); //loose match
//  return grade.toString().matches(".*([2468]o.*semester|semester.*[2468]o).*"); //equivalent to contains
}

兩者都有相同的目的,但每個都有其差異、弱點和優勢。

如果別的

  • 讀寫困難(代碼很難寫,因為你需要在一個語句中包含多值檢查)

  • 您選擇的決定是您的代碼是否將被執行。

  • 與開關一樣,如果其值不為真(否則),您可以創建default語句。

轉變

  • 易於編寫和閱讀代碼。

  • 您將始終輸入 switch 塊,如果沒有與您輸入的值匹配的大小寫,它將默認。

  • 您只能在情況下使用charint

  • 你只有一個條件,不像 if / else 你可以有幾種類型的條件。

結論:

在性能問題上,切換通常更快,但差異很小。

如果您要檢查的情況很少,我會使用if/else ,但在您的情況下,建議您顯示的代碼使用switch case來檢查您僅在一個代碼塊中執行的檢查次數。

正則表達式可能比 if-else 或 switch 慢。 但在你的情況下,我會更加重視可讀性並使用正則表達式。

private boolean validGrade(final StringBuilder grade) {
    return grade.toString().matches("(2o|4o|6o|8o) semester");
}

暫無
暫無

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

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