天天看點

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

你已經看到了可以用Collection接口的stream方法将任何集合轉換為一個流。如果你有一個數組,那麼可以使用靜态的Stream.of方法。

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

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

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

使用Array.stream(array, from, to)可以從數組中位于from(包括)和to(不包括)的元素中建立一個流。

為了建立不包含任何元素的流,可以使用靜态的Stream.empty方法:

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

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

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

或者像下面這樣擷取一個随機數的流:

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

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

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

該序列中的第一個元素是種子BigInteger.ZERO,第二個元素是f(seed),即1(作為大整數),下一個元素是f(f(seed)),即2,後續以此類推。

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

程式清單1-2中的示例程式展示了建立流的各種方式。

程式清單1-2 streams/CreatingStreams.java

《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立
《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立
《Java核心技術 卷Ⅱ 進階特性(原書第10版)》一1.2 流的建立

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()

提供一個值。