【发布时间】:2016-04-23 14:22:49
【问题描述】:
使用 Java 8 流和 lambda 进行并行唯一字数统计的最佳方法是什么?
我想出了几个,但我不相信它们是最佳的。 我知道 Hadoop 上的 map reduce 解决方案,想知道它们是否提供相同的并行性。
// Map Reduce Word Count
Map<String, Integer> wordCount = Stream.of("dog","cat","dog","dog","cow","house","house").parallel().collect( Collectors.groupingBy(e->e,Collectors.summingInt(e -> 1)));
System.out.println("number of dogs = " + wordCount.get("dog"));
Map<Object, Object> wordCount2 = Stream.of("dog","cat","dog","dog","cow","house","house").parallel().collect(Collectors.toConcurrentMap(keyWord->keyWord, keyWord->1, (oldVal,newVal)->(int)oldVal+(int)newVal));
System.out.println("number of dogs = " + wordCount2.get("dog"));
假设实际列表会更长,可能来自文件或生成的流,并且我想知道所有单词的计数,而不仅仅是 dog。
【问题讨论】:
-
第一个看起来不错。注意:短列表通常比单线程更好,并且在您的示例中使用过滤器/计数会更快。
-
编辑了问题以澄清在长列表中查找所有字数。
标签: java lambda mapreduce word-count java-stream