根据 Java 中的另外两张地图创建地图

Create Map based on two other maps in Java

如何使用 Java 8 个流基于另外两个地图构建地图?也就是说,我有以下地图结构:

map1 = Map<MyModel, List<String>>();
map2 = Map<String, String>();

其中 map1List<String> 值与 map2 中的 String 键相同。换句话说,基于 map1 values,可以将其用作 map2 中的 keys,并从那里得到 values

所以,我的问题是如何使用流和 lambda 技术合并这两个地图,并构建一个新地图,其中将包含 MyModel as keysList<Strings> as values 而没有重复项?

这是我目前拥有的:

map1 = Map<MyModel, List<String>>();
map2 = Map<String, String>();

Map<MyModel, List<String>> map3 = Stream.of(map1, map2)
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        Map.Entry::getValue,
        (v1, v2) -> v1
    )
);

如有任何帮助,我们将不胜感激。

下面是我很快想到的。可能有更有效的方法来实现您的要求,但它至少会给您一个开始。

代码

public static void main(String[] args) {
    //Map 1
    Map<Integer, List<String>> map1 = new HashMap<>();
    map1.put(1, Arrays.asList("A", "B"));
    map1.put(2, Arrays.asList("C", "D"));

    //Map 2
    Map<String, String> map2 = new HashMap<>();
    map2.put("A", "Apple");
    map2.put("B", "Banana");
    map2.put("C", "Cherries");
    map2.put("D", "Dewberries");

    Map<Integer, List<String>> collect = map1.entrySet()
            .stream()
            .map(entry -> {
                return new AbstractMap.SimpleImmutableEntry<>(
                        entry.getKey(),
                        entry.getValue()
                                .stream()
                                .map(map2::get)
                                .filter(Objects::nonNull)
                                .collect(Collectors.toList())
                );
            })
            .collect(Collectors.toMap(AbstractMap.SimpleImmutableEntry::getKey, AbstractMap.SimpleImmutableEntry::getValue));

    System.out.println(collect);
}

输出

{1=[Apple, Banana], 2=[Cherries, Dewberries]}

让我们从转换 List<String> list 开始,方法是查找 map2 的值并丢弃重复项:

import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
.....

list.stream()
    .filter(map2::containsKey)  // make sure map2 has this key
    .map(map2::get)             // get the value
    .distinct()                 // discard duplicates
    .collect(toList());         // make new list

现在你只需使用上面的作为值映射器(静态导入 Collectors 方法)来解决你的问题:

map1.entrySet().stream().collect(toMap(
    Map.Entry::getKey,
    e -> e.getValue().stream()
        .filter(map2::containsKey)
        .map(map2::get)
        .distinct()
        .collect(toList())
));