Java9系列第6篇-Stream流API的加強


我計劃在後續的一段時間內,寫一系列關於java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,可是仍是有不少的特性值得關注。期待您能關注我,我將把java 9 寫成一系列的文章,大概十篇左右,本文是第6篇。vue

本文帶你們快速的瞭解一下在Java 9 種集合類Colleaction子類都發生了哪些比較有用的變化與加強。java

在Java 9中對Java Util Stream的語法進行了優化和加強,下面我就和你們一塊兒看一下有哪些比較有價值的使用方法。spring

1. Stream.takeWhile(Predicate)

在進行Stream流的管道數據處理的時候,提供的Predicate條件返回false以後,將跳過剩餘的數據元素直接返回。在下面的示例中,一旦Predicate條件!"orange" .equals(s)返回false,則將跳過其餘元素:後端

String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
 Stream<String> stream = Arrays.stream(fruits)
                               .takeWhile(s -> !"orange".equals(s));
 stream.forEach(System.out::println);

控制檯輸出結果爲,依次對數組中元素過濾,到orange元素知足了!"orange" .equals(s) === false,流式處理再也不繼續直接返回。數組

apple
 banana

須要注意的是:對於無序Stream,若是存在多個與提供的Predicate匹配的元素(多個orange),則此操做返回值是不肯定的。springboot

這種方法看上去和Java 8中的Stream.filter()很類似,可是它們的不一樣之處在於filter()方法只是跳過了不匹配的元素,而後繼續進行處理。然而takeWhile()方法在存在匹配項以後會跳過全部剩餘的元素,有點像continue和break的區別。如下是具備相同流和Predicate的filter()方法示例:app

String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
 Stream<String> stream = Arrays.stream(fruits).filter(s -> !"orange".equals(s));
 stream.forEach(System.out::println);

控制檯輸出以下,只是把orange過濾掉了。前後端分離

apple
 banana
 mango
 peach

2.Stream.dropWhile(Predicate)

提供的Predicate條件在管道流中返回false以後,此元素後面的全部數據元素做爲返回值返回。微服務

String[] fruits = {"apple", "banana", "orange", "mango", "peach"};
 Stream<String> stream = Arrays.stream(fruits)
                            .dropWhile(s -> !"orange".equals(s));
 stream.forEach(System.out::println);

在上面示例中,一旦Predicate條件!"orange".equals(s) 返回false,管道流中剩餘的元素將被接受(不被過濾),做爲返回值返回:優化

orange
 mango
 peach

3.Stream Stream.iterate(T,Predicate,UnaryOperator)

一旦Predicate條件返回false,此方法將返回一個順序流,該順序流將中止迭代操做。T爲初始值,迭代操做由UnaryOperator來提供

Stream<String> iterate = Stream.iterate("-", 
                                  s -> s.length() < 5,    //Predicate條件
                                  s -> s + "-");   //迭代操做
 iterate.forEach(System.out::println);

控制檯打印輸出的結果,只輸出四個橫槓,到第五個的時候中止。這是由Predicate條件決定的。

-
 --
 ---
 ----

4.Stream Stream.ofNullable(T)

此方法返回一個包含單個元素的順序Stream。若是提供的元素爲null,則此方法返回空Stream。當咱們要將非空單個元素附加到流時,此方法頗有用。例如:

String nullableItem = "peach";
 Stream<String> stream = Stream.of("apple", "banana", "orange");
 Stream<String> stream2 = Stream.concat(stream, Stream.ofNullable(nullableItem));
 stream2.forEach(System.out::println);

控制檯打印輸出結果以下:

apple
 banana
 orange
 peach

5.IntStream,LongStream和DoubleStream方法

下面的這些XxxStream類也具備與Stream類等效的方法(ofNullable()方法除外)。

IntStream.of(2, 4, 6, 8, 9, 10, 11)
          .takeWhile(i -> i % 2 == 0)
          .forEach(System.out::println);   //2,4,6,8
IntStream.of(2, 4, 6, 8, 9, 10, 11)
          .dropWhile(i -> i % 2 == 0)
          .forEach(System.out::println);  // 9,10,11
IntStream.iterate(0, i -> i < 10, i -> i + 1)
          .forEach(System.out::print); // 0123456789

歡迎關注個人博客,裏面有不少精品合集

  • 本文轉載註明出處(必須帶鏈接,不能只轉文字):字母哥博客

以爲對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創做動力! 。另外,筆者最近一段時間輸出了以下的精品內容,期待您的關注。

相關文章
相關標籤/搜索