Lambda 基于Java中的另外两个映射创建映射

Lambda 基于Java中的另外两个映射创建映射,lambda,java-8,java-stream,map-function,Lambda,Java 8,Java Stream,Map Function,如何使用Java8流基于其他两个映射构建映射?即,我有以下地图结构: map1 = Map<MyModel, List<String>>(); map2 = Map<String, String>(); 任何帮助都将不胜感激 下面是我很快想到的东西。也许有一种更有效的方法来实现您的需求,但它至少会给您一个开始 代码 让我们从转换列表开始,方法是从map2中查找值并丢弃重复项: import static java.util.stream.Collectors

如何使用Java8流基于其他两个映射构建映射?即,我有以下地图结构:

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

任何帮助都将不胜感激

下面是我很快想到的东西。也许有一种更有效的方法来实现您的需求,但它至少会给您一个开始

代码


让我们从转换
列表开始,方法是从
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
现在,您只需将上述内容用作值映射器(通过静态导入
收集器
方法)即可解决您的问题:

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

使用
entry.setValue
将尝试修改源映射,这是危险的。如果修改原稿是可以接受的,最好用
map1.replaceAll((k,v)->…)
感谢@Misha.的反馈。。我已编辑代码,不更新现有的Map.Entry,而是创建并返回另一个对象。@GarrethGolding,感谢您的响应,您的方法也可以使用!但正如你上面提到的,米沙的回答很好,很简洁;)回答得好。。非常感谢您的回复。使用建议的方法表明,无法从
映射的静态上下文错误引用非静态方法。Entry::getKey
,也无法解决
e.getValue().stream()
@Dozent()的方法错误。请确保包含
toList
toMap
的静态导入。请看@Misha,我用了另一种方式,但在流范围内使用了您的技术。谢谢你的主意。它被接受了:D
{1=[Apple, Banana], 2=[Cherries, Dewberries]}
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
map1.entrySet().stream().collect(toMap(
    Map.Entry::getKey,
    e -> e.getValue().stream()
        .filter(map2::containsKey)
        .map(map2::get)
        .distinct()
        .collect(toList())
));