有没有更好的方法来避免在OR
条件下出现多个if
语句?
我有if
条语句,其中OR
的字符串超过8个。
if(type.equalsIgnoreCase(anotherString1) ||
type.equalsIgnoreCase(anotherString2) ||
type.equalsIgnoreCase(anotherString3)){
return true;
}
寻找更好的方法来编写带有多个if
语句的OR
或如何避免
答案 0 :(得分:7)
非常简单,您可以构建具有不同值的Set来测试小写(如果需要,可以使用toLowerCase()
)。
然后,将您的声明更改为:
if (<set_name>.contains(type.toLowerCase()))
感兴趣的还在于您在代码中添加了一些语义。您的集合将具有一个名称,该名称在功能上适合您的情况(allowedUserTypes
,elementTypesToProcess
或其他名称),并且可以设置在有用的位置以供重用(如果相关)。
答案 1 :(得分:3)
一种避免使用if
语句链或许多||
运算符的方法
可能是switch
。
要使用switch
来达到相同的结果,应类似于:
switch(type){
case anotherString1:
case anotherString2:
case anotherString3:
return true;
}
请注意,这些案例中的每一个都是相互影响的,这意味着如果遇到任何此类案例,我们将return true
。
请记住,这假设情况已被忽略。
此处有关switch
的更多信息:https://www.geeksforgeeks.org/string-in-switch-case-in-java/
答案 2 :(得分:1)
假设设法将所有otherString1
,otherString2
和otherString3
放在名为List<String> otherStrings
的列表中,那么您可以利用contains()
方法。但这并不能解决您的所有问题,因为您想忽略这种情况。
因此,让我们将流用作this other SO answer suggests:
List<String> otherStrings = ...;
boolean containsType = otherStrings.stream()
.anyMatch(otherString-> otherString.equalsIgnoreCase(type));
这样做的好处是,您可以在otherString
中包含任意数量的List
,而无需更改实现。
答案 3 :(得分:0)
如果您的所有条件都尝试匹配给定的字符串,则可以列出字符串并使用contains (https://docs.oracle.com/javase/8/docs/api/java/util/List.html#contains-java.lang.Object-)
List<String> list = Arrays.asList("type1", "type2",......);
if (type != null) {
if (list.contains(type.toLowerCase())) {
return true;
}
}
答案 4 :(得分:0)
使用流,您可以执行以下操作:
return Stream.of(anotherString1,anotherString2,anotherString3)
.anyMatch(e->e.equalsIgnoreCase(type));
它甚至可以省略if语句。
答案 5 :(得分:0)
由于不涉及任何状态,建议您按照以下方法创建一个静态方法。
public static boolean anyEqual(String arg, String... strs) {
return Arrays.stream(strs).map(String::toLowerCase).collect(
Collectors.toSet()).contains(arg.toLowerCase());
}
然后您可以按以下两种方式调用该方法:
String[] strs = { "string1", "string2", "string3"
};
System.out.println(anyEqual("string2", strs));
System.out.println(anyEqual("test", "test1", "test2", "test3"));