在if语句中重构多个条件的最佳方法是什么?

时间:2019-09-30 21:05:26

标签: java if-statement

我有一个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))
{...} 

5 个答案:

答案 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))) {

}

我想说要移出nullif块之外,最好的方法是返回空的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
}