5 回答
TA贡献1797条经验 获得超6个赞
首先将所有键收集到列表中并使用 java-8streams.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))) {
}
TA贡献1911条经验 获得超7个赞
您可以编写一个辅助方法containsAny:
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)) {
...
}
TA贡献1871条经验 获得超8个赞
'''简短且无帮助的答案'''':重新考虑您的模型,使其不需要多个 if 语句。
'''不是那么长,但有洞察力和实用的答案'':创建一个类的层次结构,其中每个类都描述一个实体,该实体将在每个相关的 If-case 上测试属性。
根据定义,Stuffy 类是满足匹配 if-1 要求的对象。if-2 的情况是一样的...他们都会实现 Anything...
然后,每个具体类将实现自己的 doIt() (使用您将放在每个 ifX 子句上的代码),而不是使用肮脏丑陋的 if 的大而丑陋的 doIt() 方法。
TA贡献2021条经验 获得超8个赞
我觉得你的情况很奇怪。但
if (Stream.of(key1, key2, key3, key4).anyMatch(rqstCriteria::contains) ||
rqstCriteria.contains(key5) &&
anotherCriteria != null &&
Stream.of(key1, key2, key3, key4, key5).anyMatch(anotherCriteria::contains))
{}
TA贡献1772条经验 获得超8个赞
要使用谓词添加另一种方法:
假设您的条件列表存储字符串,请创建一个包含您的键的集合:
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
}
添加回答
举报