使用流修改地图



我有一个地图,我正在迭代它并使用for循环修改地图的值。我想知道是否有办法使用 Java 8 流来做到这一点。

这是我的代码:

Map<String,MyObject> myMap = getResultMap();
for (Map.Entry<String, MyObject> entry : myMap.entrySet()) {
entry.getValue.setName(getName());
entry.getValue.setId(getId());
entry.getValue.setDept(getDept());
entry.getValue.isValid(isValid();
entry.getValue.setPipeLine(getPipeLine());
}

基本上,我想流式传输地图值并设置值并将其作为新地图获取。

由于流操作,您可以只获得新Stream或新Map,但Stream不能改变数据(但您可以创建执行任何操作的 lambda(。例如,使用您的代码示例:

Map<String, MyObject> myMap = getResultMap();
Map<String, MyObject> newMap = myMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry ->
{
entry.getValue().setName(getName());
entry.getValue().setId(getId());
entry.getValue().setDept(getDept());
entry.getValue().setValid(isValid());
entry.getValue().setPipeLine(getPipeLine());
return entry.getValue();
}
));

但是不要更新Stream内部的共享可变变量!它可能会产生许多问题。

最好创建MyObject类的新实例,而不是修改myMap

Map<String, MyObject> newMap = myMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry ->
{
MyObject myObject = new MyObject();
myObject.setName(getName());
myObject.setId(getId());
myObject.setDept(getDept());
myObject.setValid(isValid();
myObject.setPipeLine(getPipeLine());
return myObject;
}
));