我計劃在後續的一段時間內,寫一系列關於java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關注。期待您能關注我,我將把java 9 寫成一系列的文章,大概十篇左右,本文是第6篇。
本文帶大家快速的瞭解一下在Java 9 種集合類Colleaction子類都發生了哪些比較有用的變化與增強。
在Java 9中對Java Util Stream的語法進行了優化和增強,下面我就和大家一起看一下有哪些比較有價值的使用方法。
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),則此操作返回值是不確定的。
這種方法看上去和Java 8中的Stream.filter()很相似,但是它們的不同之處在於filter()方法只是跳過了不匹配的元素,然後繼續進行處理。然而takeWhile()方法在存在匹配項之後會跳過所有剩餘的元素,有點像continue和break的區別。以下是具有相同流和Predicate的filter()方法示例:
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
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。