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

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

{...} 


POPMUISE
浏览 128回答 5
5回答

FFIVE

首先将所有键收集到列表中并使用 java-8streams.anyMatchList<String> list = List.of("key1","key2");&nbsp; //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)) &&&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Objects.nonNull(anotherCriteria) &&&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; list.stream().anyMatch(j->anotherCriteria.contains(j))) {}

Smart猫小萌

您可以编写一个辅助方法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)) {    ...} 

ITMISS

'''简短且无帮助的答案'''':重新考虑您的模型,使其不需要多个 if 语句。'''不是那么长,但有洞察力和实用的答案'':创建一个类的层次结构,其中每个类都描述一个实体,该实体将在每个相关的 If-case 上测试属性。根据定义,Stuffy 类是满足匹配 if-1 要求的对象。if-2 的情况是一样的...他们都会实现 Anything...然后,每个具体类将实现自己的 doIt() (使用您将放在每个 ifX 子句上的代码),而不是使用肮脏丑陋的 if 的大而丑陋的 doIt() 方法。

宝慕林4294392

我觉得你的情况很奇怪。但if (Stream.of(key1, key2, key3, key4).anyMatch(rqstCriteria::contains) ||&nbsp; &nbsp; rqstCriteria.contains(key5) &&&nbsp;&nbsp; &nbsp; anotherCriteria != null &&&nbsp;&nbsp; &nbsp; Stream.of(key1, key2, key3, key4, key5).anyMatch(anotherCriteria::contains)){}&nbsp;

料青山看我应如是

要使用谓词添加另一种方法:假设您的条件列表存储字符串,请创建一个包含您的键的集合: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) &&&nbsp; &nbsp;isNotNullOrEmpty.and(containsOneOfMyKeys).test(anotherCriteria)){&nbsp; &nbsp;//do something}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java