pri*_*ain 9 java count java-8 java-stream collectors
我想计算一个流的不同元素,我想知道为什么
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));
Run Code Online (Sandbox Code Playgroud)
不起作用.Eclipse告诉我
收集器类型中的Map(Function,Function,BinaryOperator)方法不适用于参数((s) - > {},int,Integer :: sum)
顺便说一句,我知道这个解决方案:
Map<String, Long> counter2 = stream.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)
所以我有两个问题:
编辑:我自己解决了第一个问题:
Map<String, Integer> counter1 = stream.collect(Collectors.toMap(s -> s, s -> 1, Integer::sum));
Run Code Online (Sandbox Code Playgroud)
Java期望一个函数作为第二个参数.
确实有几种方法可以做到这一点.你没有提到的是.collect(groupingBy(x -> x, summingInt(x -> 1)));
性能有一些差异.
如果每个桶的对象非常少,方法#1将处于最佳状态.在每桶只有一个对象的理想情况下,您最终会立即得到最终地图,而无需修改条目.在具有大量重复对象的最坏情况下,它将不得不进行大量的装箱/拆箱.
方法#2依赖于counting()收集器,它没有详细说明它应该如何进行计数.当前的实施转发reducing但可能会改变.
该summingInt方法将累积计数int而不是Integer,因此不需要任何装箱/拆箱.如果对象重复很多次,它将处于最佳状态.
至于选择哪一个,最好编码以便在必要时进行清晰度和优化.对我来说,groupingBy(x->x, counting())最明确地表达了意图,所以这是我赞成的.
| 归档时间: |
|
| 查看次数: |
9070 次 |
| 最近记录: |