本节将介绍如何从值序列、数组、文件来创建流,甚至由生成函数来创建无限流!
通过集合生成流
通过集合生成,应用中最常用的一种
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = integerList.stream();
由值创建流
通过 Stream 的 of 方法生成流,通过 Stream 的 empty 方法可以生成一个空流
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
你可以使用empty得到一个空流,如下所示:
Stream
由数组创建流
你可以使用静态方法Arrays.stream从数组创建一个流。它接受一个数组作为参数。例如,你可以将一个原始类型int的数组转换成一个IntStream,如下所示:
int[] intArr = new int[]{1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(intArr);
通过 Arrays.stream 方法生成流,并且该方法生成的流是数值流【即 IntStream 】而不是 Stream。补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能。
Stream API 提供了mapToInt、mapToDouble、mapToLong三种方式将对象流【即 Stream】转换成对应的数值流,同时提供了 boxed 方法将数值流转换为对象流
由文件生成流
Stream<String> lines = Files
.lines(Paths.get("data.txt"), Charset.defaultCharset())
通过 Files.line 方法得到一个流,并且得到的每个流是给定文件中的一行
Java中用于处理文件等I/O操作的NIO API(非阻塞 I/O)已更新,以便利用Stream API。java.nio.file.Files中的很多静态方法都会返回一个流。例如,一个很有用的方法是Files.lines,它会返回一个由指定文件中的各行构成的字符串流。使用你迄今所学的内容,你可以用这个方法看看一个文件中有多少各不相同的词:
long uniqueWords = 0;
try(Stream
Files.lines(Paths.get(“data.txt”), Charset.defaultCharset())){ ←─流会自动关闭
uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(“ “))) ←─生成单词流
.distinct() ←─删除重复项
.count(); ←─数一数有多少各不相同的单词
}
catch(IOException e){
←─如果打开文件时出现异常则加以处理
}
你可以使用Files.lines得到一个流,其中的每个元素都是给定文件中的一行。然后,你可以对line调用split方法将行拆分成单词。应该注意的是,你该如何使用flatMap产生一个扁平的单词流,而不是给每一行生成一个单词流。最后,把distinct和count方法链接起来,数数流中有多少各不相同的单词。
由函数生成流:创建无限流
iterator
Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5);
iterate 方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为 iterator 生成的流为无限流,通过 limit 方法对流进行了截断,只生成 5 个偶数
generator
Stream<Double> stream = Stream.generate(Math::random).limit(5);
generate 方法接受一个参数,方法参数类型为 Supplier,由它为流提供值。generate 生成的流也是无限流,因此通过 limit 对流进行了截断