天天看點

java8-Stream流的建立

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,它會傳回一個由指定檔案中的各行構成的字元串流。使用你迄今所學的内容,

你可以用這個方法看看一個檔案中有多少各不相同的詞 :

  

java8-Stream流的建立

  你可以使用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之間的随機雙精度數。

轉載于:https://www.cnblogs.com/toBearShmily/p/8384287.html