使用Java 8合并两个映射

dar*_*rdy 11 java java-stream

我有两张这样的地图:

map1 = new Map<String, MyObject>();
map2 = new Map<String, MyObject>();

MyObject {
   Integer mark1;
   Integer mark2;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是将两个地图合并成map3 <String, MyObject>如下:

  1. 如果map1.place不在map2.place,那么我将条目添加到map3.
  2. 同样如果map2.place不在map1.place,我添加条目map3.
  3. 如果map1.placemap2.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.