计算流的元素

我想统计一个流的不同元素,我想知道为什么

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中的Map(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期待函数作为第二个参数。


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

    性能有一些差异。

    如果每个桶中的对象非常少,则方法#1将处于最佳状态。 在每桶只有1个对象的理想情况下,您将立即得到最终地图,无需修改条目。 在最坏的情况下,有大量的重复对象,它将不得不做很多拳击/拆箱。

    方法#2依赖于counting()收集器,它并没有详细说明它应该如何进行计数。 目前的实施转向reducing但可能会改变。

    summingInt方法将累计int而不是Integer ,因此不需要任何装箱/拆箱。 如果对象重复很多次,它将处于最佳状态。

    至于选择哪一个,最好在代码清晰和优化的情况下进行优化。 对我来说, groupingBy(x->x, counting())最清楚地表达了意图,所以这就是我所喜欢的意图。

    链接地址: http://www.djcxy.com/p/85381.html

    上一篇: Counting elements of a Stream

    下一篇: What is really happening on removing and adding white space characters?