我有一个if语句,里面有很多条件,但是条件完全不同。看起来真的很大。我不确定是否有办法。
// rqstCriteria is a List
// anotherCriteria is a List
// key# are the different values that I want to see if it has
if (
rqstCriteria.contains(key1) ||
rqstCriteria.contains(key2) ||
rqstCriteria.contains(key3) ||
rqstCriteria.contains(key4) ||
rqstCriteria.contains(key5) &&
(anotherCriteria != null &&
(anotherCriteria.contains(key1) ||
anotherCriteria.contains(key2) ||
anotherCriteria.contains(key3) ||
anotherCriteria.contains(key4) ||
anotherCriteria.contains(key5))
{...}
答案 0 :(得分:1)
首先将所有密钥收集到列表中,然后使用java-8 streams.anyMatch
List<String> list = List.of("key1","key2"); //or Arrays.asList()
if(list.stream().anyMatch(i->rqstCriteria.contains(i)) && list.stream().anyMatch(j->anotherCriteria.contains(j))) {
}
我想说要移出null
到if
块之外,最好的方法是返回空的List
或使用下面的方法
if(list.stream().anyMatch(i->rqstCriteria.contains(i)) &&
Objects.nonNull(anotherCriteria) &&
list.stream().anyMatch(j->anotherCriteria.contains(j))) {
}
答案 1 :(得分:0)
您可以编写一个辅助方法containsAny
(感谢@chrylis对其进行优化):
public <T> boolean containsAny(Collection<T> c, T... keys) {
return c != null && Arrays.stream(keys).anyMatch(c::contains);
}
然后在if语句中使用它:
if (containsAny(rqstCriteria, key1, key2, key3, key4, key5)
&& containsAny(anotherCriteria, key1, key2, key3, key4, key5)) {
...
}
答案 2 :(得分:0)
'''简短而无助的答案'''':重新考虑模型,不需要多个if语句。
“不是那么长,而是要洞察完整而实用”,创建一个类的层次结构,其中每个类都描述一个实体,该实体将对每个相关的If-case进行测试。 >
Stuffy类将是根据定义满足满足if-1要求的对象。 Thingy在if-2方面是相同的...他们都将实现任何方法...
然后,每个具体的类都将实现自己的doIt()(使用将放置在每个ifX子句中的代码),而不是用笨拙的if来代替笨拙的doIt()方法。
答案 3 :(得分:0)
我认为您的情况很奇怪。但是
public string @operator
答案 4 :(得分:0)
使用谓词添加另一种方法:
假设您的条件列表存储了字符串,请创建一个包含密钥的集合:
Set<String> myKeys = Set.of("key1","key2","key3","key4","key5");
和两个接受列表的谓词
Predicate<List<String>> containsOneOfMyKeys = l -> l.stream().anyMatch(s -> myKeys.contains(s));
Predicate<List<String>> isNotNullOrEmpty = l -> Objects.nonNull(l) && !l.isEmpty();
然后,您可以通过可读的方式简化if语句:
if(containsOneOfMyKeys.test(rqstCriteria) &&
isNotNullOrEmpty.and(containsOneOfMyKeys).test(anotherCriteria)){
//do something
}