使用流根据键在键值对上应用不同的功能

时间:2018-09-03 17:11:31

标签: java java-8 hashmap java-stream

当前代码使用普通的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)

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

2 个答案:

答案 0 :(得分:3)

一种可能的方式(虽然不使用流)可以迭代键,值对(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";

答案 1 :(得分:0)

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

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