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
中是否存在两个字符串(例如 2o
和 semester
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))) {
两者的目的相同,但各有不同、优缺点。
如果/否则
读写困难(代码很难写,因为你需要在一个语句中包含多值检查)
你的选择决定了你的代码是否会被执行
与开关一样,如果其值不为真 (else),您可以创建一个 default
语句。
切换
易于编写和阅读代码。
你会一直输入switch块,如果没有大小写匹配你输入的值就默认。
只能用char
或int
的情况。
你只有一个条件,不像 if / else 你可以有多种类型的条件。
结论:
在性能问题上,切换通常更快,但差异很小。
如果您要检查的案例很少,我会使用 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
// return grade.toString().matches(".*([2468]o.*semester|semester.*[2468]o).*"); //equivalent to contains
}
正则表达式可能比 if-else 或 switch 慢。但在你的情况下,我会更重视可读性并使用正则表达式。
private boolean validGrade(final StringBuilder grade) {
return grade.toString().matches("(2o|4o|6o|8o) semester");
}
我有这样的方法
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
中是否存在两个字符串(例如 2o
和 semester
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))) {
两者的目的相同,但各有不同、优缺点。
如果/否则
读写困难(代码很难写,因为你需要在一个语句中包含多值检查)
你的选择决定了你的代码是否会被执行
与开关一样,如果其值不为真 (else),您可以创建一个
default
语句。
切换
易于编写和阅读代码。
你会一直输入switch块,如果没有大小写匹配你输入的值就默认。
只能用
char
或int
的情况。你只有一个条件,不像 if / else 你可以有多种类型的条件。
结论:
在性能问题上,切换通常更快,但差异很小。
如果您要检查的案例很少,我会使用 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
// return grade.toString().matches(".*([2468]o.*semester|semester.*[2468]o).*"); //equivalent to contains
}
正则表达式可能比 if-else 或 switch 慢。但在你的情况下,我会更重视可读性并使用正则表达式。
private boolean validGrade(final StringBuilder grade) {
return grade.toString().matches("(2o|4o|6o|8o) semester");
}