你已經看到了可以用Collection接口的stream方法将任何集合轉換為一個流。如果你有一個數組,那麼可以使用靜态的Stream.of方法。
of方法具有可變長參數,是以我們可以建構具有任意數量引元的流:
使用Array.stream(array, from, to)可以從數組中位于from(包括)和to(不包括)的元素中建立一個流。
為了建立不包含任何元素的流,可以使用靜态的Stream.empty方法:
Stream接口有兩個用于建立無限流的靜态方法。generate方法會接受一個不包含任何引元的函數(或者從技術上講,是一個Supplier接口的對象)。無論何時,隻要需要一個流類型的值,該函數就會被調用以産生一個這樣的值。我們可以像下面這樣獲得一個常量值的流:
或者像下面這樣擷取一個随機數的流:
為了産生無限序列,例如0 1 2 3 …,可以使用iterate方法。它會接受一個“種子”值,以及一個函數(從技術上講,是一個UnaryOperation),并且會反複地将該函數應用到之前的結果上。例如,
該序列中的第一個元素是種子BigInteger.ZERO,第二個元素是f(seed),即1(作為大整數),下一個元素是f(f(seed)),即2,後續以此類推。
程式清單1-2中的示例程式展示了建立流的各種方式。
程式清單1-2 streams/CreatingStreams.java
java.util.stream.Stream 8
static Stream of(T... values)
産生一個元素為給定值的流。
static Stream empty()
産生一個不包含任何元素的流。
static Stream generate(Supplier s)
産生一個無限流,它的值是通過反複調用函數s而建構的。
static Stream iterate(T seed, UnaryOperator f)
産生一個無限流,它的元素包含種子、在種子上調用f産生的值、在前一個元素上調用f産生的值,等等。
java.util.Arrays 1.2
static Stream stream(T[] array, int startInclusive, int endExclusive) 8
産生一個流,它的元素是由數組中指定範圍内的元素構成的。
java.util.regex.Pattern 1.4
Stream splitAsStream(CharSequence input) 8
産生一個流,它的元素是輸入中由該模式界定的部分。
java.nio.f?ile.Files 7
static Stream lines(Path path) 8
static Stream lines(Path path, Charset cs) 8
産生一個流,它的元素是指定檔案中的行,該檔案的字元集為UTF-8,或者為指定的字元集。
java.util.function.Supplier 8
T get()
提供一個值。