【问题标题】:GroupBy and merge into a single list in javaGroupBy并合并到java中的单个列表中
【发布时间】:2018-07-24 11:41:06
【问题描述】:

Java 8 在 Collectors 中提供了 groupingBy 函数,但它提供了元素映射。我需要将地图转换为单个列表。

它还返回结果,但我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在 lambda 表达式中无法重新分配。

我怎样才能做到这一点?

我想实现这个:

Map<String, List<Node>> nodeListGrouped = nodeList.stream().collect(Collectors.groupingBy(node -> node.getGroupName()));

将 nodeListGrouped 转换为单个 List

但是 nodeListGrouped.values() 返回 Collection(List)

【问题讨论】:

  • Collectors.collectingAndThen(Collectors.toMap(whatevermappings), map -&gt; {whatever transformations from map to List you have in mind})?
  • 顺便说一句,您在这里已经是 4 年的会员,您确实明白,除非您提供详细信息/示例,否则这会因为不清楚而被关闭?
  • 所以你的问题是values 返回一个Collection&lt;List&lt;Node&gt;&gt; 而你想要一个List&lt;Node&gt;
  • 是的,我也无法重新分配 groupedList,因为它给出了错误“列表应该是最终的或有效的最终”

标签: lambda java-8 collectors


【解决方案1】:

我想这就是你要找的东西(虽然我还没有编译过)

List<Node> list = 
         nodeList.stream()
                 .collect(Collectors.collectingAndThen(
                     Collectors.groupingBy(Node::getGroupName),
                     map -> map.values()
                               .stream()
                               .flatMap(List::stream)
                               .collect(Collectors.toList())
));

【讨论】:

  • 它说 collectionAndThen 对于收藏者来说是未定义的,我尝试了 collectAndThen ,然后它说要一次又一次地投射它
  • @ManojMajumdar 我的错,是collectingAndThen,已编辑
  • 谢谢哥们!!那太快了!!帮助表示赞赏
  • 我在这里遗漏了什么?您正在分组,然后将列表展平为最初的列表,这使得整个管道变得不必要。
  • @Aominè 哦,拍! :|这里完全是脑残,需要向OP询问详情...
【解决方案2】:

将地图值从Collection&lt;List&lt;Node&gt;&gt; 扁平化为List&lt;Node&gt;几乎肯定不是您想要的,因为它基本上呈现与初始列表相同的结果;如果您确实想得到List&lt;Node&gt; 作为结果,那么不要做任何事情,因为这就是初始列表已经提供的。

你肯定需要重新考虑你到底想要完成什么。问问你自己,为什么我需要分组才能得到与初始列表相同的结果?一旦你找到了答案,也许你会意识到你根本不需要这样做,或者可能有其他方法可以更好地完成你的任务。

【讨论】:

  • 我完全同意!
  • @Aominè,我只想对元素进行分组,使它们彼此相邻,然后只显示整个元素列表(节点)
  • @ManojMajumdar 是的,如果您最初在帖子中提到这一点,或者至少创建一个方法来指示可读性的意图,那就太好了。无论如何,另一个更短且更易读的选项只是克隆初始列表,然后按照#Holger 在您的答案下建议的组名对其进行排序。或者,如果您不介意更改初始列表,只需按组名对其进行排序以获取相邻元素。也就是说,最终选择哪种方法是您的选择。
【解决方案3】:

我看不到将地图转换回列表的好处,因为您将丢失分组键。您可以做的是通过调用entrySet() 方法而不是values() 将地图转换回List&lt;Map.Entry&lt;String, List&lt;Node&gt;&gt;&gt;

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2022-09-30
    • 2019-12-22
    • 2020-09-22
    • 2018-12-09
    相关资源
    最近更新 更多