可以使用 Java 8 开始添加到 Collection 接口的 stream 方法将任何 collection 转换为 stream。如果是数组,则可用静态 Stream.of 方法获得 stream。
Stream words = Stream.of(contents.split("[\\P{L}]+"));
// split returns a String[] array
of 方法有可变长参数,因此可以根据任意数量的参数构造流:
Stream song = Stream.of("gently", "down", "the", "stream");
使用 Arrays.stream(array,from,to) 可以从数组的一部分生成流。如果要创建没有元素的流,可使用静态 Stream.empty 方法:
Stream silence = Stream.empty();
// Generic type is inferred; same as Stream.empty()
Stream 接口中的 generate 方法可用于生成无限流。每当需要用到一个值时,都会调用函数产生一个值。
例如,可以用以下方式创建返回常量的流:
Stream echos = Stream.generate(() -> "Echo");
或者,返回随机数的流:
Stream randoms = Stream.generate(Math::random);
如果要生成像 0,1,2,3… 这样的序列,那么可以调用 iterate 方法,这个方法需要两个参数,第一个参数获取一个“种子”,第二个参数是一个函数,例如:
Stream integers
= Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
以上方法调用后生成的序列的第一个元素是 BigInteger.ZERO 这个“种子”,第二个元素是 f(seed),也就是 2,第三个元素是 f(f(seed)),也就是 3,以此类推。这里的 f() 函数就是上面的第二个参数。
Java 8 发行版已将许多产生流的方法添加到 API。例如,Pattern 类有方法 splitAsStream,该方法通过正则表达式拆分 CharSequence。可以使用以下语句将字符串拆分为单词:
Stream words
= Pattern.compile("[\\P{L}]+").splitAsStream(contents);
静态 Files.lines 方法返回文件中所有行的 Stream。Stream 接口有 AutoCloseable 作为超级接口。当在流上调用 close 方法时,底层文件也将关闭。因此最好使用 Java 7 的 try-with-resources 语句:
try (Stream lines = Files.lines(path)) {
//Do something with lines
}
当 try 语句块正常退出或异常退出时,将关闭流及其附带的文件。