Java比较值,最佳方法

问题描述 投票:1回答:4

我有这样的方法

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;
    }

我的疑问是:哪一个更好?两者以相同的方式工作?

java performance methods switch-statement comparison
4个回答
2
投票

[这两种方法都不相同,在第一种方法中,您使用contains检查grade中存在的两个字符串(例如2o中的semestergrade)。但是在第二种方法中,您要检查grade等于2o semester。我更喜欢收集所有列表并使用anyMatch

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

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

1
投票

两者都有相同的目的,但各有千秋,各有千秋。

如果/否则

  • 书写和阅读困难(由于您需要在一条语句中包含多值支票,所以代码难以编写)] >>>

  • 您的决定是是否执行代码。

  • 与开关一样,如果其值不为真(否则),则可以创建default语句。

  • Switch

  • 易于编写和阅读代码。

  • 您将始终输入切换块,如果没有大小写与您输入的值匹配的情况,它将默认。

  • 在某些情况下,您只能使用charint

  • 您只有一个条件,与是否可以拥有多种类型的条件不同。

  • 结论:

在性能问题上,切换通常更快,但差异很小。

如果您要检查的情况很少,我会使用if/else,但对于您所显示的代码,建议仅使用一个代码块中的检查次数使用switch case

为什么不迭代这些可能性?

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
}

Regex可能比if-else或switch慢。但是,在您的情况下,我会在可读性上赋予更多价值,并使用正则表达式。

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

1
投票

为什么不迭代这些可能性?


0
投票

Regex可能比if-else或switch慢。但是,在您的情况下,我会在可读性上赋予更多价值,并使用正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.