为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

POPMUISE 2023-09-13 18:09:40
我有一个 if 语句,里面有很多条件,但条件相当不同。它看起来真的很笨重。我不确定是否有办法做到这一点。// rqstCriteria is a List// anotherCriteria is a List// key# are the different values that I want to see if it hasif (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 回答

?
FFIVE

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


}


查看完整回答
反对 回复 2023-09-13
?
Smart猫小萌

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

    ...


查看完整回答
反对 回复 2023-09-13
?
ITMISS

TA贡献1871条经验 获得超8个赞

'''简短且无帮助的答案'''':重新考虑您的模型,使其不需要多个 if 语句。

'''不是那么长,但有洞察力和实用的答案'':创建一个类的层次结构,其中每个类都描述一个实体,该实体将在每个相关的 If-case 上测试属性。

根据定义,Stuffy 类是满足匹配 if-1 要求的对象。if-2 的情况是一样的...他们都会实现 Anything...

然后,每个具体类将实现自己的 doIt() (使用您将放在每个 ifX 子句上的代码),而不是使用肮脏丑陋的 if 的大而丑陋的 doIt() 方法。


查看完整回答
反对 回复 2023-09-13
?
宝慕林4294392

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))

{} 


查看完整回答
反对 回复 2023-09-13
?
料青山看我应如是

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

}


查看完整回答
反对 回复 2023-09-13
  • 5 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信