使用jdk8 stream 统计单词数
在我的SpringBoot2.0不容错过的新特性 WebFlux响应式编程里面,有同学问如何使用stream统计单词数。这是个好例子,也很典型,在这里补上。
下面的例子实现了从一个文本文件读取(英文)文本并统计单词数的功能。
package com.imooc; import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; /**
* 使用stream统计文章单词数
*
* @author 晓风轻
*
*/
public class StreamWordDemo { public static void main(String[] args) throws IOException {
// 使用try-resource 关闭资源
try (BufferedReader reader = new BufferedReader(
new FileReader("webflux.txt"))) { long wordCount = reader.lines()
// trim前后空格(使用方法引用)
.map(String::trim)
// 过滤掉空串
.filter(s -> !s.isEmpty())
// 把空格隔开的转为单词数组
.map(s -> s.split(" "))
// 得到数组长度
.mapToInt(array -> array.length)
// 并行(都是无状态操作)
.parallel()
// 求和
.sum(); System.out.println("单词数:" + wordCount);
}
}
}
牵涉的知识点主要还是lambda表达式和stream的基本应用。大家可以看出,使用stream编程代码非常清晰和简单,可读性很强。
下面获取每个单词出现的次数
// 使用try-resource 关闭资源
try (BufferedReader reader = new BufferedReader(
new FileReader("webflux.txt"))) { Map<String, Long> counts = reader.lines()
// trim前后空格(使用方法引用)
.map(String::trim)
// 过滤掉空串
.filter(s -> !s.isEmpty())
// 把空格隔开的转为数组
.map(s -> s.split(" "))
// 数组转成流
.map(array -> Stream.of(array))
// 拉平
.flatMap(stream -> stream)
// 分组
.collect(Collectors.groupingBy(s -> s, Collectors.counting())); System.out.println("单词出现次数:" + counts); // 统计信息
LongSummaryStatistics summaryStatistics = counts.entrySet().stream()
// 得到次数
.mapToLong(entry -> entry.getValue())
// 统计
.summaryStatistics(); System.out.println("统计信息:" + summaryStatistics);
}
输出的统计
信息为:
统计信息:LongSummaryStatistics{count=170, sum=271, min=1, average=1.594118, max=14}
可以看出,一共有271个单词,不同的词有170个,出现最多的14次,最少1次,平均1.594118次。
这就是stream的编程风格,其中lambda表达式是函数式编程的基础,是后面的stream,reactor的前置基础知识。对lambda表达式,stream流编程以及响应式编程webflux有更多兴趣的可以学习我的实战课程 SpringBoot2.0不容错过的新特性 WebFlux响应式编程,里面有详细的讲解,课程干货满满,7小时只需要128元,海量的知识点的底层实现讲解和自己动手编写响应式的类似feign的restclient,绝对物超所值!
上面范例代码github地址:stream流编程处理单词
作者: 晓风轻
链接:https://www.imooc.com/article/27508
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
使用jdk8 stream 统计单词数的更多相关文章
- 统计单词数(WordCount)
1.首先新建两个文件夹: 往文件夹添加内容: 2.启动hadoop-查看是否启动成功. 3.先对nameNode进行初始化. 4.查看hadoop下面有哪些文件. 5.在hadoop目录下创建inpu ...
- 05:统计单词数【NOIP2011复赛普及组第二题】
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- AC日记——统计单词数 openjudge 1.12 5
05:统计单词数 总时间限制: 1000ms 内存限制: 65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...
- noip2011普及组——统计单词数
统计单词数 时间限制:1 s 内存限制:128MB [问题描述]一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.现在,请你编程实 ...
- linux统计单词数
sort +awk+uniq 统计文件中出现次数最多的前10个单词 实例 cat logt.log|sort -s -t '-' -k1n |awk '{print $1;}'|uniq -c|sor ...
- codevs 1131 统计单词数
#include<iostream> #include<string> using namespace std; int main() { string s, s0; getl ...
- 洛谷 P1308 统计单词数【string类及其函数应用/STL】
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给 ...
- 洛谷 P1308 统计单词数
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 杭电oj 2072————统计单词数(java)
problem:统计单词数 思路:利用HashMap的特性——不能反复存储同一个键得数据,所以可以保证map里边儿的元素都是不重复的,存储完毕之后直接输出size就好了 注意事项: 1.利用strin ...
随机推荐
- 剑指Offer——贪心算法
剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...
- 【一天一道LeetCode】#299. Bulls and Cows
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 You are ...
- 对Bitmap的内存优化
在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...
- Android之Gallery和Spinner-Android学习之旅(二十九)
Spinner简介 spinner是竖直方向展开一个列表供选择.和gallery都是继承了AbsSpinner,AbsSpinner继承了AdapterView,因此AdaptyerView的属性都可 ...
- 【一天一道LeetCode】#155. Min Stack
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Design ...
- 【设计模式】java设计模式总述及观察者模式
今天在准备腾讯的面试时想起来要复习一下设计模式,而刚好前几天在参加网易的在线考试的时候,也出了一道关于设计模式的选择题,主要是考察观察者模式,虽然那道题自己做对了,但觉得还是应该好好总结一下设计模式的 ...
- UNIX环境高级编程——存储映射I/O(mmap函数)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共 ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- GDAL库中WFS服务中含有中文不能获取数据的问题
GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别.通过调试发现,其原因有下面两点: 1.输入的URL路径没有使用UTF8编码而从网 ...
- tomcat集群机制剖析及其生产部署选型
为什么要使用集群? 为什么要使用集群?主要有两方面原因:一是对于一些核心系统要求长期不能中断服务,为了提供高可用性我们需要由多台机器组成的集群:另外一方面,随着访问量越来越大且业务逻辑越来越复杂,单台 ...