亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號