Java基础 自学讲义 卷2 一.流库
终于开始学卷二啦~ ????
关于流Stream的知识这篇博文讲的很好 Java Stream详解 | 鸟窝
1.1.从迭代到流
看一个demo用于筛选文档中长度大于某个值的单词的数量:
String file = new String(Files.readAllBytes(Paths.get("alphabet.txt")), StandardCharsets.UTF_8);
List<String> s = Arrays.asList(file.split("\\PL+"));
//Java8流的方法
long count = s.parallelStream()//这里用的并行流, 串行流直接stream
.filter(w->w.length()>=6)
.count();
System.out.println(count);
//迭代的方法
long countt = 0;
for(String i : s){
if(i.length()>=7) countt++;
}
System.out.println(countt);
先读入一个文件, 用String的构造器配合Files的io接口, 用split分割筛选出所有的连续英文单词;
note:这里split使用正则筛选做split分割, 这里的\PL+是匹配任意长度(>=1)的非英文字符, 一旦匹配到非英文字符就做分割, 所以分割之后获得的就是一个个纯连续英文单词;
也就是说 \PL+匹配非英文字母的字符 也可以用\PZ+匹配非分隔符的字符 用\PN+来匹配非数字的字符~
但是我觉得这里可能会有歧义啊, 如何区分是在按这个策略匹配还是我想匹配\PLLLL这样的字符串呢?
也可以这样来匹配:
List<String> s = Arrays.asList(file.split("[^a-zA-Z]+"));
1.2 流的创建
1.3 常用的几个方法
filter用于筛选流的某些元素, 产生一个新的满足filter条件的流;
map是对流中的每个元素传入一个lambda表达式做处理得到处理后的流;
flatmap是对于每个元素经过处理返回多个元素然后把得到的多个元素组合进一个新的流里, map 生成的是个 1:1 映射,每个输入元素,都按照规则转换成为另外一个元素。还有一些场景,是一对多映射关系的,这时需要 flatMap。