流的计数元素

问题描述 投票:9回答:2

我想计算流的不同元素,并想知道为什么

Stream<String> stream = Stream.of("a", "b", "a", "c", "c", "a", "a", "d");
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, 1, Integer::sum));

无效。 Eclipse告诉我

类型为Collectors的toMap(Function,Function,BinaryOperator)方法不适用于参数((s)-> {},int,Integer :: sum)

顺便说一下,我知道该解决方案:

Map<String, Long> counter2 = stream.collect(Collectors.groupingBy(s -> s, Collectors.counting()));

所以我有两个问题:

  1. 我的第一种方法有什么错误?
  2. 您将如何实现这样的计数器?

编辑:我自己解决了第一个问题:

Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum)); 

Java期望函数作为第二个参数。

java count java-8 java-stream collectors
2个回答
6
投票

确实有几种方法可以做到。您没有提到的是.collect(groupingBy(x -> x, summingInt(x -> 1)));


0
投票

如果您不使用并行流,则以下内容应该起作用:

© www.soinside.com 2019 - 2024. All rights reserved.