本节将介绍如何从值序列、数组、文件来创建流,甚至由生成函数来创建无限流!

通过集合生成流

通过集合生成,应用中最常用的一种

  1. List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
  2. Stream<Integer> stream = integerList.stream();

由值创建流

通过 Stream 的 of 方法生成流,通过 Stream 的 empty 方法可以生成一个空流

  1. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

你可以使用empty得到一个空流,如下所示:
Stream emptyStream = Stream.empty();

由数组创建流

你可以使用静态方法Arrays.stream从数组创建一个流。它接受一个数组作为参数。例如,你可以将一个原始类型int的数组转换成一个IntStream,如下所示:

  1. int[] intArr = new int[]{1, 2, 3, 4, 5};
  2. IntStream stream = Arrays.stream(intArr);

通过 Arrays.stream 方法生成流,并且该方法生成的流是数值流【即 IntStream 】而不是 Stream。补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能。
Stream API 提供了mapToInt、mapToDouble、mapToLong三种方式将对象流【即 Stream】转换成对应的数值流,同时提供了 boxed 方法将数值流转换为对象流

由文件生成流

  1. Stream<String> lines = Files
  2. .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 lines =
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

  1. Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5);

iterate 方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为 iterator 生成的流为无限流,通过 limit 方法对流进行了截断,只生成 5 个偶数

generator

  1. Stream<Double> stream = Stream.generate(Math::random).limit(5);

generate 方法接受一个参数,方法参数类型为 Supplier,由它为流提供值。generate 生成的流也是无限流,因此通过 limit 对流进行了截断

参考:

https://mp.weixin.qq.com/s/DiFib195GFYOWTAu0__cIg