我有两张这样的地图:
map1 = new Map<String, MyObject>();
map2 = new Map<String, MyObject>();
MyObject {
Integer mark1;
Integer mark2;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将两个地图合并成map3 <String, MyObject>如下:
map1.place不在map2.place,那么我将条目添加到map3.map2.place不在map1.place,我添加条目map3.map1.place是map2.place,那么我添加此条目:
map1.place, (map1.mark1, map2.mark2)我已经读过了flatMap,但我真的很难用它.有任何线索如何做到这一点?
谢谢!!
Nic*_*tto 20
它可以使用Stream API适当mergeFunction的下一个完成:
Map<String, MyObject> map3 = Stream.of(map1, map2)
.flatMap(map -> map.entrySet().stream())
.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new MyObject(v1.getMark1(), v2.getMark2())
)
);
Run Code Online (Sandbox Code Playgroud)
这将条目连接map1后跟条目map2,然后将所有内容转换为一个Map合并函数,该函数将使用mark1第一个值(来自一个map1)和 mark2第二个值(来自一个map2),以防重复键.
或者它也可以使用不同的方式来完成Supplier<Map>,它将提出已经包含条目的地图,map1然后我们只关注添加map2下一个条目:
Map<String, MyObject> map3 = map2.entrySet()
.stream()
.collect(
Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new MyObject(v1.getMark1(), v2.getMark2()),
() -> new HashMap<>(map1)
)
);
Run Code Online (Sandbox Code Playgroud)
Ash*_*Ash 15
这是我认为可行的
Map<String, MyObj> map3 = new HashMap<>(map1);
map2.forEach(
(key, value) -> map3.merge(key, value, (v1, v2) -> new MyObject(v1.mark1,v2.mark2))
);
Run Code Online (Sandbox Code Playgroud)
合并函数正在处理您的场景3,因为如果该键已经存在,它将使用v1.mark1和v2.mark2创建一个新的MyObject.
| 归档时间: |
|
| 查看次数: |
22079 次 |
| 最近记录: |