我是lambda表达式的新手,正在尝试在作业中使用它。
问题:
我有两个地图m1
和m2
类型Map<Integer, String>
,其中有合并成一个单一的地图Map<Integer, List<String>>
,其中两个映射相同的键的值被收集到一个列表,并投入了新的地图。
根据我探索的解决方案:
Map<Integer, List<String>> collated =
Stream.concat(m1.entrySet().stream(), m2.entrySet().stream()).collect(
Collectors.toMap(Entry::getKey,
Entry::getValue, (a, b) -> {
List<String> merged = new ArrayList<String>(a);
merged.addAll(b);
return merged;
}));
但是,此解决方案期望源List
与Map<Integer, List<String>>
toMap中的合并函数期望操作数和结果为同一类型。
我不想更改源集合。请提供有关使用lambda表达式实现此目标的意见。
我现在无法对其进行测试,但是我认为您需要它才能将值的映射从Entry :: getValue更改为包含该值的List:
Map<Integer, List<String>> collated =
Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.toMap(Entry::getKey,
e -> {
List<String> v = new ArrayList<String>();
v.add(e.getValue());
return v;
},
(a, b) -> {
List<String> merged = new ArrayList<String>(a);
merged.addAll(b);
return merged;
}));
编辑:这个想法是正确的。语法不是。当前的语法有效,尽管有点难看。必须有更短的编写方法。
您也可以替换e -> {..}
为e -> new ArrayList<String>(Arrays.asList(new String[]{e.getValue()}))
。
或搭配 e -> Stream.of(e.getValue()).collect(Collectors.toList())
编辑:
或者,您可以使用groupingBy
:
Map<Integer, List<String>> collated =
Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句