根据 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
。
所以,我的问题是如何使用流和 lambda 技术合并这两个地图,并构建一个新地图,其中将包含 MyModel as keys
和 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
)
);
如有任何帮助,我们将不胜感激。
下面是我很快想到的。可能有更有效的方法来实现您的要求,但它至少会给您一个开始。
代码
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())
));
如何使用 Java 8 个流基于另外两个地图构建地图?也就是说,我有以下地图结构:
map1 = Map<MyModel, List<String>>();
map2 = Map<String, String>();
其中 map1
的 List<String>
值与 map2
中的 String
键相同。换句话说,基于 map1 values
,可以将其用作 map2
中的 keys
,并从那里得到 values
。
所以,我的问题是如何使用流和 lambda 技术合并这两个地图,并构建一个新地图,其中将包含 MyModel as keys
和 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
)
);
如有任何帮助,我们将不胜感激。
下面是我很快想到的。可能有更有效的方法来实现您的要求,但它至少会给您一个开始。
代码
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())
));