![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
1.2 流的创建
你已经看到了可以用Collection接口的stream方法将任何集合转换为一个流。如果你有一个数组,那么可以使用静态的Stream.of方法。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/003-2-i.jpg?sign=1739262429-LGNppTUUYs3NhNuqdfoudMkd5QCTUjpe-0-ab2ff5fb6fc7e8614cc9390687606333)
of方法具有可变长参数,因此我们可以构建具有任意数量引元的流:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-i.jpg?sign=1739262429-uNOORIloelBVXd75ZTt1Pycv5G0WUJVB-0-78bb1f6d2c4e041cd8c4a98d3e8262e5)
使用Array.stream(array,from,to)可以从数组中位于from(包括)和to(不包括)的元素中创建一个流。
为了创建不包含任何元素的流,可以使用静态的Stream.empty方法:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-2-i.jpg?sign=1739262429-u7WQMQtohuI2rLjLTeFCNdOaSYyIOiSr-0-ad9ef669847a3a243fbcfa250ecd6c91)
Stream接口有两个用于创建无限流的静态方法。generate方法会接受一个不包含任何引元的函数(或者从技术上讲,是一个Supplier<T>接口的对象)。无论何时,只要需要一个流类型的值,该函数就会被调用以产生一个这样的值。我们可以像下面这样获得一个常量值的流:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-3-i.jpg?sign=1739262429-K3XjGIfqlMfl5cxB0041QSpTqgo4J4og-0-f92ffc54f029dcd21cbf1b6d9bdf2423)
或者像下面这样获取一个随机数的流:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-4-i.jpg?sign=1739262429-CEr1dX1JUnr3Uwiw8ckm2iOqZmWmfLaX-0-479c74e2acc3502abc1a2d06ca48512d)
为了产生无限序列,例如0 12 3…,可以使用iterate方法。它会接受一个“种子”值,以及一个函数(从技术上讲,是一个UnaryOperation<T>),并且会反复地将该函数应用到之前的结果上。例如,
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-5-i.jpg?sign=1739262429-zYftp6RbpD0QmMb1IlXdc45UXIpnGgax-0-48cd7d5aa955b71e6e74928fccc201ff)
该序列中的第一个元素是种子BigInteger.ZERO,第二个元素是f(seed),即1(作为大整数),下一个元素是f(f(seed)),即2,后续以此类推。
注意:Java API中有大量方法都可以产生流。例如,Pattern类有一个splitAsStream方法,它会按照某个正则表达式来分割一个CharSequence对象。可以使用下面的语句来将一个字符串分割为一个个的单词:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-6-i.jpg?sign=1739262429-7jUfsuy4zcRSyvlZEKrHsyXrHOgYRIdP-0-cad60142515a53d3de1016c3b813afdb)
静态的Files.lines方法会返回一个包含了文件中所有行的Stream:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-7-i.jpg?sign=1739262429-vo3jgUy5B1GERhYGN9mIiSx5t0gnkGfn-0-77272b0c4056531706f9aa5d319915f0)
程序清单1-2中的示例程序展示了创建流的各种方式。
程序清单1-2 streams/CreatingStreams.java
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/004-8-i.jpg?sign=1739262429-17ePxdvheBkdxcGaB0GcMo4stSBBsGfV-0-aef4f736168ddcc1808427a34b57cbfd)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/005-i.jpg?sign=1739262429-XSVwokwmckkW0Y4DO68y4cEkrhdWy8jy-0-0dfd7cc23eb3aea8b88b7a42c673c9b3)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/006-i.jpg?sign=1739262429-Yn4T3MQplwrfg1kuBL6amwvoe6V5YAK3-0-1ae8ab26d8462747551fd8cf38347968)
java.util.stream.Stream 8
·static<T>Stream<T>of(T... values)
产生一个元素为给定值的流。
·static<T>Stream<T>empty()
产生一个不包含任何元素的流。
·static<T>Stream<T>generate(Supplier<T>s)
产生一个无限流,它的值是通过反复调用函数s而构建的。
·static<T>Stream<T>iterate(T seed,UnaryOperator<T>f)
产生一个无限流,它的元素包含种子、在种子上调用f产生的值、在前一个元素上调用f产生的值,等等。
java.util.Arrays 1.2
·static<T>Stream<T>stream(T[]array,int startInclusive,int endExclusive)8
产生一个流,它的元素是由数组中指定范围内的元素构成的。
java.util.regex.Pattern 1.4
·Stream<String>splitAsStream(CharSequence input)8
产生一个流,它的元素是输入中由该模式界定的部分。
java.nio.file.Files 7
·static Stream<String>lines(Path path)8
·static Stream<String>lines(Path path,Charset cs)8
产生一个流,它的元素是指定文件中的行,该文件的字符集为UTF-8,或者为指定的字符集。
java.util.function.Supplier<T>8
·T get()
提供一个值。