【发布时间】:2015-08-07 16:45:56
【问题描述】:
我想计算一个流的不同元素,想知道为什么
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()));
所以我有两个问题:
- 我的第一种方法中的错误是什么?
- 您将如何实现这样的计数器?
编辑:我自己解决了第一个问题:
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum));
Java 期望一个函数作为第二个参数。
【问题讨论】:
-
如果您自己解决了问题,只需写一个答案而不是编辑问题。
-
@TagirValeev 这只是第一部分。答案不应该回答完整的问题吗?我也希望人们不再担心告诉我我做错了什么。
-
@NitinDandriyal 这正是第二种方法。
-
如果您需要
Map<String, Integer>,您可以使用.collect(groupingBy(s -> s, summingInt(s -> 1)));,尽管counting()方法更具可读性。
标签: java count java-8 java-stream collectors