使用Java中的Stream流的方式实现单词的频次统计

使用Java中的Stream流的方式实现单词的频次统计


单词的频次统计是学习大数据中的一个相当经典的案例。像使用MapReduce、Scala、Spark、Hive等技术都可以完成,相应的操作。在Java8中,其新增的特性Stream流,也可以很简单的完成单词频次统计的案例。
下面上一段代码:

@Test
  public void test() {
  	List<String> list = Arrays.asList("hello","hadoop","hive","hadoop","hadoop","hello");
  	list.stream().collect(Collectors.groupingBy((x)->x)).values().stream().map((x)->{Map map=new HashMap<>();map.put(x.get(0), x.size());return map;}).forEach(System.out::println);
  }

这里是输出结果:
{hive=1}
{hadoop=3}
{hello=2}
这样,就通过一句话就完成了这个单词频次统计的小案例。看这种代码风格是不是很像Scala语言。
下面,我来把上面的代码做一下拆分:

@Test
	public void test() {
		List<String> list = Arrays.asList("hello","hadoop","hive","hadoop","hadoop","hello");
		Map<String, List<String>> collect = list.stream().collect(Collectors.groupingBy((x)->x));
		Stream<Map<String,Integer>> stream = collect.values().stream().map((x)->{Map<String, Integer> map=new HashMap<>();map.put(x.get(0), x.size());return map;});
		stream.forEach(System.out::println);
	}

更加精简的写法:

List<String> words = Arrays.asList("hello", "hadoop", "hive", "hadoop", "hadoop", "hello");
System.out.println(words.parallelStream().collect(Collectors.groupingBy(it -> it, Collectors.counting())));

或:

List<String> words = Arrays.asList("hello", "hadoop", "hive", "hadoop", "hadoop", "hello");
System.out.println(words.parallelStream().map(it -> new Tuple<>(it, 1)).collect(Collectors.groupingBy(Tuple::getIt1,
                Collectors.summingInt(Tuple::getIt2))));
@Data
@AllArgsConstructor
class Tuple<T, E> {
    private T it1;
    private E it2;
}

Python中的写法:

words = ["hello", "hadoop", "hive", "hadoop", "hadoop", "hello"]
print({word: words.count(word) for word in words})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值