文章参考:《Java核心技术卷 卷2》
在处理集合时,我们通常会迭代遍历他的元素,并对元素进行各种操作。例如:我们想要对某本书的所有长单词进行计数:
String con=new String(Files.readAllBytes(Paths.get("book.txt")), StandardCharsets.UTF_8);//从文件读取字符串
List<String> words=List.of(con.split("\\PL+")); //进行文本切割
//迭代
int count= 0;
for (String word : words) {
if (word.length()>12){
count++;
}
}
//使用流
long num=words.stream().filter(w->w.length() >12).count();
现在我们不必扫描整个代码去查找过滤和计数操作,方法名直接告诉我们想要做什么。
使用循环需要自己去编写代码来执行指定的操作,而流却能直接以我们想要的运行方式调度这些操作,只要结果是正确的就行。
注:1.流遵循了“做什么而非怎么做‘的原则。
2.流并不存储其元素,所有的元素都可能在底层集合中,或是按需生成。
3.流的操作不会修改其数据源。例如:filter方法不会从流中移除元素,而是会生成一个新的流,其中不包括被过滤掉的元素。
4.流的操作是尽可能惰性执行的。