【问题标题】:Using streams to apply different functions on key value pair depending on keys使用流根据键在键值对上应用不同的功能
【发布时间】:2024-05-15 16:55:02
【问题描述】:

目前代码使用普通的旧 foreach 循环

String preEvalObj = new String("123");
for(Map.Entry<String, Float> entry : someHashMap.entrySet()){
  String key = entry.getKey();
  Float value = entry.getValue();
  if(preEvalObj.equals(key)){
    lambda1Onvalue...
  }else{
    lambda2lambda1Onvalue..
  }
}

我正在努力实现类似的目标

someHashMap.entrySet().stream().apply((key,value) -> if preEvalObj.equals(key) lambda1 else lambda2)

我可以使用流来实现我的目标吗?

【问题讨论】:

  • lambdas 会返回一些东西吗?你想对映射的值做什么?将它们放在一个列表中,映射,只是根据每个键使用不同的值?

标签: java java-8 hashmap java-stream


【解决方案1】:

使用@nullpointer 的答案,如果目标是更改值,您可以这样做

myHashMap.entrySet().stream().forEach(e -> {
      if (!e.getKey().equals(trigger))
          e.setValue(setNewValue);
      else
          e.setValue(setOtherNewValue);
  });
}

【讨论】:

    【解决方案2】:

    一种可能的方法(虽然不使用流)可能是迭代键值对(BiConsumer 实现)为:

    someHashMap.forEach((key, value) -> {
        if (preEvalObj.equals(key)) {
            someOpsOnValue(); // lambda1Onvalue
        } else {
            someOtherOpsOnValue(); // lambda2lambda1Onvalue
        }
    });
    

    或至少在恕我直言时表达为更具可读性

    BiConsumer<String, Float> biConsumer = (key, value) -> {
        if (key.equals("123")) { // preEvalObj
           someOpsOnValue(); // lambda1Onvalue
        } else {
           someOtherOpsOnValue(); // lambda2lambda1Onvalue..
        }
    };
    
    someHashMap.forEach(biConsumer);
    

    旁注,构造函数对于 String 初始化是多余的 -

    String preEvalObj = "123";
    

    【讨论】:

    • 没错,非常感谢:)
    • 但请注意存在专用查找方法,例如 Map.get(…),它比遍历所有映射并在每个键上调用 equals 更有效。