【问题标题】:Collectors.groupingBy and mapping to construct a mapCollectors.groupingBy 和 mapping 构造一个映射
【发布时间】:2018-11-25 16:06:59
【问题描述】:

请看下面的代码。我的意图是使用 groupingBy 和映射通过流 API 获得Map<String, List<Integer>>。用于获取此输出映射的逻辑是将 ArrayList al 的内容分组并计算相同元素出现的次数。

例如,元素 A 出现了两次,所以我想获得一个键为 A,值为 2 的映射。同样,对于 B,我希望将 B 视为键,将 3 视为值。我只是不太清楚如何为此实现映射功能。我能够编写分组。我可以获得帮助完成带有问号 (????) 的 lambda。

public static void main(String[] args) {
    ArrayList<String> al = new ArrayList<>();
    al.add("A");
    al.add("A");
    al.add("B");
    al.add("B");
    al.add("B");
    al.add("V");
    al.add("V");
    al.add("C");
    al.add("C");
    System.out.println(
             al.stream()
             .collect(groupingBy(Function.identity(), mapping(??????, toList()))));
}

【问题讨论】:

  • 你自相矛盾。首先你说你想要一个 Map>。您说您希望键为 A,值为 2。2 不是 List

标签: java java-8 java-stream


【解决方案1】:

你可以这样做,

Map<String, Long> keyCountMap = al.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

注意使用下游收集器来计算计数。

【讨论】:

  • 或出于任何原因,他们希望密钥成为 Integer 然后 .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(e -&gt; 1)));.collect(toMap(Function.identity(), v -&gt; 1, Math::addExact));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多