1.由值創建流
可以使用靜態方法Stream.of,通過顯式值創建一個流。它可以接受任意數量的參數。例如,以下代碼直接使用Stream.of創建了一個字符串流。然后,你可以將字符串轉換為大寫,再一個個打印出來
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
stream.map(String::toUpperCase).forEach(System.out::println);
如何獲得一個空流:
Stream<String> emptyStream = Stream.empty();
2.由數組創建流
可以使用靜態方法Arrays.stream從數組創建一個流。它接受一個數組作為參數。例如,你可以將一個原始類型int的數組轉換成一個IntStream,如下所示:
int[] numbers = {2, 3, 5, 7, 11, 13};
int sum = Arrays.stream(numbers).sum(); //計算和
3.由文件生成流
Java中用於處理文件等I/O操作的NIO API(非阻塞 I/O)已更新,以便利用Stream API。java.nio.file.Files中的很多靜態方法都會返回一個流。例如,一個很有用的方法是Files.lines,它會返回一個由指定文件中的各行構成的字符串流。使用你迄今所學的內容,
你可以用這個方法看看一個文件中有多少各不相同的詞 :

你可以使用Files.lines得到一個流,其中的每個元素都是給定文件中的一行。然后,你可以對line調用split方法將行拆分成單詞。應該注意的是,你該如何使用flatMap產生一個扁平的單詞流,而不是給每一行生成一個單詞流。最后,把distinct和count方法鏈接起來,數
數流中有多少各不相同的單詞。
4.由函數生成流:創建無限流
Stream API提供了兩個靜態方法來從函數生成流: Stream.iterate和Stream.generate。
這兩個操作可以創建所謂的無限流:不像從固定集合創建的流那樣有固定大小的流。由iterate
和generate產生的流會用給定的函數按需創建值,因此可以無窮無盡地計算下去!一般來說,
應該使用limit(n)來對這種流加以限制,以避免打印無窮多個值。
1. 迭代
我們先來看一個iterate的簡單例子,然后再解釋:
Stream.iterate(0, n -> n + 2)
.limit(10)
.forEach(System.out::println);
iterate方法接受一個初始值(在這里是0),還有一個依次應用在每個產生的新值上的
Lambda(UnaryOperator<t>類型)。這里,我們使用Lambda n -> n + 2,返回的是前一個元
素加上2。因此, iterate方法生成了一個所有正偶數的流:流的第一個元素是初始值0。然后加
上2來生成新的值2,再加上2來得到新的值4,以此類推。這種iterate操作基本上是順序的,
因為結果取決於前一次應用。請注意,此操作將生成一個無限流——這個流沒有結尾,因為值是
按需計算的,可以永遠計算下去。我們說這個流是無界的。正如我們前面所討論的,這是流和集
合之間的一個關鍵區別。我們使用limit方法來顯式限制流的大小。這里只選擇了前10個偶數。
然后可以調用forEach終端操作來消費流,並分別打印每個元素。
2. 生成
與iterate方法類似, generate方法也可讓你按需生成一個無限流。但generate不是依次
對每個新生成的值應用函數的。它接受一個Supplier<T>類型的Lambda提供新的值。我們先來
看一個簡單的用法:
Stream.generate(Math::random)
.limit(5)
.forEach(System.out::println);
這段代碼將生成一個流,其中有五個0到1之間的隨機雙精度數。
