lambda - 基于 Java 中的另外两个 map 创建 Map

标签 lambda java-8 java-stream map-function

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

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

哪里List<String> map1 的值与 String 相同输入map2 。换句话说基于 map1 values可以将其用作 keysmap2并得到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
    )
);

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

最佳答案

让我们从改造 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())
));

关于lambda - 基于 Java 中的另外两个 map 创建 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51252668/

相关文章:

c++ - lambda 函数 c++ 按值捕获重置其值,为什么?

java - Completable Future什么时候将线程释放回线程池?

java - 如何使用另一个列表中的对象的属性创建一个新列表

java - 编写一个 Java 8 谓词来过滤不在范围内的值

Java 8 流列表收集器内存分配速度与带有预分配的循环

c++ - 错误 : conversion from 'main()::<lambda()>' to non-scalar type 'function<void()>' requested

c# - 就像在 Lambda 表达式和 LINQ 中一样

c# - Lambda 解释和它是什么以及一个很好的例子

java - MappedByteBuffer 写入文件不起作用

java - transient 如何在序列化 Java 中与 final 一起工作