繁体   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