我有一个地图,我正在迭代它并使用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;
}
));