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

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 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号