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

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

Java 流 - 在一次迭代中應用兩個過濾器并收集到兩個集合

Java 流 - 在一次迭代中應用兩個過濾器并收集到兩個集合

米脂 2022-12-28 16:26:18
我有一個要迭代的地圖,我想用兩個條件檢查 entryset 的值;如果滿足條件1,我將其分組到一個集合findFirst()中Optional<>,如果不滿足,則用另一個條件過濾并收集到另一個集合中,執行相同操作。我for在一次迭代中處理了循環。現在,如果我只想用 Java 8 流迭代一次,有可能嗎?我試過stream().filter(cond1).map(Map.Entry::getValue).findFirst()(重復兩次)。我也檢查過groupingBy(),partitionBy()但我還沒有看到這種可能性。方法 1 的示例:for (Map.Entry<String, Response> entry: responses.entrySet()) {    String key = entry.getKey();    Response value = entry.getValue();    if (key.equals("foo") && !value.equals("bar")) {        res1 = value;    } else if (key.equals("some other key")) {        res2 = value;    }}Response finalResponse = res1 != null ? res1 : res2;方法 2 的示例:Optional<Response> res1 = Optional.empty();Response res2;res1 = responses.entrySet().stream()        .filter(entry -> entry.getKey().equals("foo") &&                 !entry.getValue().equals("bar"))        .map(Map.Entry::getValue)        .findFirst();res2 = responses.entrySet().stream()        .filter(entry -> entry.getKey().equals("some other key"))        .map(Map.Entry::getValue)        .findFirst().orElse(null);Response finalResponse = res1.orElse(res2);
查看完整描述

2 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

如果您的條件只是基于.equals()一個鍵和值,就像您在問題中顯示的那樣,您可以只使用map.get()一個簡單的if語句:


Response result = responses.get("foo");

if (result == null || result.equals(bar))

    result = responses.get("some other key");

所以沒有必要使用任何其他東西。


或者正如 Holger 所建議的那樣,您也可以使用map.getOrDefault():


Response result = responses.getOrDefault("foo", bar); 

if(result.equals(bar))

    result = responses.get("some other key");


查看完整回答
反對 回復 2022-12-28
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

這可能是您需要使用的Optional:


Response response = Optional

        .ofNullable(responses.get("foo"))              // find the "foo" Response

        .filter(value -> !"bar".equals(value)) // except if is null or "bar"

        .orElse(responses.get("other"));    // then find the "other" response (then null)

幾點見解:

  1. 有代碼:

    if (key.equals("foo") && !value.equals("bar")) {
        res1 = value;
    } else if (key.equals("some other key")) {
        res2 = value;
    }

    盡管每個鍵可能只出現一次,但在循環內部,每次迭代都不必要地檢查這兩個條件??紤]在和被設置的break情況下的用法。res1res2

  2. java流在這里不是勝利。請注意,如果密鑰不存在,entry.getKey().equals("foo")則應縮短為map.get("foo")which 返回。null這就是為什么我將此行為與Optional.



查看完整回答
反對 回復 2022-12-28
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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