繁体   English   中英

根据Java中的其他两个地图创建地图

[英]Create Map based on two other maps in Java

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

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

其中map1 List<String>值与map2 String键相同。 换句话说,基于map1 values可以将其用作map2 keys并从中获取values

因此,我的问题是如何使用流和lambdas技术合并这两个映射,并构建一个新的映射,该映射将MyModel as keys ,将List<Strings> as values没有重复的List<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
    )
);

任何帮助,将不胜感激。

让我们开始通过查找map2值并丢弃重复项来转换List<String> list

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())
));

下面是我很快想到的。 可能有一种更有效的方式来实现您的要求,但这至少可以为您提供一个开始。

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]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM