![](/img/trans.png)
[英]How to create a map of maps from a list of maps with Java 8 streaming api
[英]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.