【问题标题】:Java 8 lambdas group list into mapJava 8 lambdas 将列表分组到地图中
【发布时间】:2015-06-10 12:09:39
【问题描述】:

我想取List<Pojo>returnMap<String, List<Pojo>>,其中Map 的键是Pojo 中的String 值,我们称之为String key

为了澄清,给出以下内容:

Pojo 1:键:值:1

Pojo 2:键:值:2

Pojo 3:键:b 值:3

Pojo 4:键:b 值:4

我想要一个 Map<String, List<Pojo>>keySet() 大小为 2,其中键“a”具有 Pojos 1 和 2,而键“b”具有 pojos 3 和 4。

我怎样才能最好地使用 Java 8 lambdas 实现这一点?

【问题讨论】:

  • 有什么问题?
  • @Eran 我已经更新了问题。
  • mapping(Function.identity(), toList()) 的意义何在? identity() 意味着“没有映射”,那么为什么还要使用映射收集器呢?只需用唯一的toList() 替换它,你最终会得到groupingBy(t -> t.getKey(), HashMap::new, toList()),它几乎描述了groupingBy 的默认值,此外,当仅使用默认值时,结果不能保证是HashMap。因此,当默认值合适时(即您不需要HashMap),请使用Eran’s answer中所示的默认值
  • 感谢@Holger,我意识到我的代码示例的不足之处,并在您的评论出现之前将其删除。您完全正确,谢谢您的建议,我很感激。

标签: java java-8 java-stream


【解决方案1】:

看来您需要的是简单的groupingBy 变体:

Map<String, List<Pojo>> map = pojos.stream().collect(Collectors.groupingBy(Pojo::getKey));

【讨论】:

  • 这里有什么方法可以简单的创建 Spring 和 POJO 的 Map 吗?
【解决方案2】:

另外,如果您想返回一个类似的地图,但不是整个 Pojo,而是希望地图的值是 Pojo 的某个属性,您可以这样做:

Map<String, List<String>> map = pojos.stream()
            .collect(
                    Collectors.groupingBy(
                            Employee::getKey, Collectors.mapping(
                                    Pojo::getSomeStringProperty, Collectors.toList())));

【讨论】:

  • 您能从性能的角度谈谈这个解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多