- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 815字
- 2020-10-30 18:10:32
1.2 流的創建
你已經看到了可以用Collection接口的stream方法將任何集合轉換為一個流。如果你有一個數組,那么可以使用靜態的Stream.of方法。

of方法具有可變長參數,因此我們可以構建具有任意數量引元的流:

使用Array.stream(array,from,to)可以從數組中位于from(包括)和to(不包括)的元素中創建一個流。
為了創建不包含任何元素的流,可以使用靜態的Stream.empty方法:

Stream接口有兩個用于創建無限流的靜態方法。generate方法會接受一個不包含任何引元的函數(或者從技術上講,是一個Supplier<T>接口的對象)。無論何時,只要需要一個流類型的值,該函數就會被調用以產生一個這樣的值。我們可以像下面這樣獲得一個常量值的流:

或者像下面這樣獲取一個隨機數的流:

為了產生無限序列,例如0 12 3…,可以使用iterate方法。它會接受一個“種子”值,以及一個函數(從技術上講,是一個UnaryOperation<T>),并且會反復地將該函數應用到之前的結果上。例如,

該序列中的第一個元素是種子BigInteger.ZERO,第二個元素是f(seed),即1(作為大整數),下一個元素是f(f(seed)),即2,后續以此類推。
注意:Java API中有大量方法都可以產生流。例如,Pattern類有一個splitAsStream方法,它會按照某個正則表達式來分割一個CharSequence對象??梢允褂孟旅娴恼Z句來將一個字符串分割為一個個的單詞:

靜態的Files.lines方法會返回一個包含了文件中所有行的Stream:

程序清單1-2中的示例程序展示了創建流的各種方式。
程序清單1-2 streams/CreatingStreams.java



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()
提供一個值。