使用Java 8 Lambda表达式合并地图流

维克多:

我是lambda表达式的新手,正在尝试在作业中使用它。

问题:

我有两个地图m1m2类型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;
                                }));

但是,此解决方案期望源ListMap<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章