1.1 从迭代到流的操作
在处理集合时,我们通常会迭代遍历它的元素,并在每个元素上执行某项操作。首先,将所有单词放到一个列表中:
String contents = new String(Files.readAllBytes(
Paths.get("test.txt")),StandardCharsets.UTF_8);
List<String> words = Arrays.asList(contents.split(" "));
//以“ ” 来分割每个word \\PL+是空格
现在,我们可以迭代它:
long count = 0;
for (String w : words) {
if(w.length()>2) count++;
}
在使用流时,相同操作看起来像下面这样:
count = words.stream().filter(w -> w.length()>2).count();
仅将stream修改为parallelStream就可以让流库以并行方式来执行过滤和计数。
count = words.parallelStream().filter(w -> w.length()>2).count();
- 流并不存储元素。这些元素可能存储在底层集合中,或者是按需生成的。
- 流的操作不会修改器数据源。例如:filter方法不会从新的流中已出元素,而是会生成新的流,其中不包含被过滤的元素。
- 流的操作是尽可能惰性执行的。这意味着直至需要其结果时,操作才会执行。例如:我们只想操作前五个单词,那么filter就会匹配到第五个单词停止过滤。因此我们可以操作无限流。
以上操作,我们建立了一个包含三个阶段的操作管道:
- 创建一个流。
- 指定将初始流转换为其他流的中间操作,可能包含多个步骤。
- 应用终止操作,从而产生结果。这个操作会强制执行之前的惰性操作。从此之后,这个流就再也不能使用了。
count = words.parallelStream().filter(w -> w.length()>2).count();
例如这段代码,用parallelStream方法创建流,filter方法对其进行转换,count方法是终止操作,当执行到count时,前面的惰性操作才会被执行。
(如有问题,请评论处指正!)
package JavaSE8的流库;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class CountLongWords {
public static void main(String[] args) throws IOException {
String contents = new String(Files.readAllBytes(
Paths.get("D:\\eclipse\\test.txt")),StandardCharsets.UTF_8);
List<String> words = Arrays.asList(
contents.split(" "));//以“ ” 来分割每个word \\PL+是空格
System.out.println(contents);
System.out.println(words);
long count = 0;
for (String w : words) {
if(w.length()>2) count++;
}
System.out.println(count);
count = words.stream().filter(
w -> w.length()>2).count();
//filter 过滤会产生一个新的流 不包含过滤掉的元素
System.out.println(count);
count = words.parallelStream().filter(
w -> w.length()>2).count();
//parallelStream 可以让流库以并行的方式执行过滤和计数
System.out.println(count);
}
}