Java9新特性Stream流API優(yōu)化與增強(qiáng)
我計(jì)劃在后續(xù)的一段時(shí)間內(nèi),寫(xiě)一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫(xiě)成一系列的文章,大概十篇左右,本文是第6篇。
java9版本特性資源自動(dòng)關(guān)閉的語(yǔ)法增強(qiáng)
Java9版本新特性同一個(gè)Jar支持多JDK版本運(yùn)行
java9新特性Reactive Stream響應(yīng)式編程 API
java9新特性Collection集合類(lèi)的增強(qiáng)與優(yōu)化方法示例
Java9新特性Java.util.Optional優(yōu)化與增強(qiáng)解析
Java9新特性對(duì)HTTP2協(xié)議支持與非阻塞HTTP API
本文帶大家快速的了解一下在Java 9 種集合類(lèi)Colleaction子類(lèi)都發(fā)生了哪些比較有用的變化與增強(qiáng)。
在Java 9中對(duì)Java Util Stream的語(yǔ)法進(jìn)行了優(yōu)化和增強(qiáng),下面我就和大家一起看一下有哪些比較有價(jià)值的使用方法。
1. Stream.takeWhile(Predicate)
在進(jìn)行Stream流的管道數(shù)據(jù)處理的時(shí)候,提供的Predicate條件返回false之后,將跳過(guò)剩余的數(shù)據(jù)元素直接返回。在下面的示例中,一旦Predicate條件!"orange" .equals(s)
返回false,則將跳過(guò)其他元素:
String[] fruits = {"apple", "banana", "orange", "mango", "peach"}; Stream<String> stream = Arrays.stream(fruits) .takeWhile(s -> !"orange".equals(s)); stream.forEach(System.out::println);
控制臺(tái)輸出結(jié)果為,依次對(duì)數(shù)組中元素過(guò)濾,到orange元素滿足了!"orange" .equals(s)
=== false,流式處理不再繼續(xù)直接返回。
apple
banana
需要注意的是:對(duì)于無(wú)序Stream,如果存在多個(gè)與提供的Predicate匹配的元素(多個(gè)orange),則此操作返回值是不確定的。
這種方法看上去和Java 8中的Stream.filter()很相似,但是它們的不同之處在于filter()方法只是跳過(guò)了不匹配的元素,然后繼續(xù)進(jìn)行處理。然而takeWhile()方法在存在匹配項(xiàng)之后會(huì)跳過(guò)所有剩余的元素,有點(diǎn)像continue和break的區(qū)別。以下是具有相同流和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);
控制臺(tái)輸出如下,只是把orange過(guò)濾掉了。
apple
banana
mango
peach
2.Stream.dropWhile(Predicate)
提供的Predicate條件在管道流中返回false之后,此元素后面的所有數(shù)據(jù)元素作為返回值返回。
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,管道流中剩余的元素將被接受(不被過(guò)濾),作為返回值返回:
orange
mango
peach
3.Stream Stream.iterate(T,Predicate,UnaryOperator)
一旦Predicate條件返回false,此方法將返回一個(gè)順序流,該順序流將停止迭代操作。T為初始值,迭代操作由UnaryOperator來(lái)提供
Stream<String> iterate = Stream.iterate("-", s -> s.length() < 5, //Predicate條件 s -> s + "-"); //迭代操作 iterate.forEach(System.out::println);
控制臺(tái)打印輸出的結(jié)果,只輸出四個(gè)橫杠,到第五個(gè)的時(shí)候停止。這是由Predicate條件決定的。
-
--
---
----
4.Stream Stream.ofNullable(T)
此方法返回一個(gè)包含單個(gè)元素的順序Stream。如果提供的元素為null,則此方法返回空Stream。當(dāng)我們要將非空單個(gè)元素附加到流時(shí),此方法很有用。例如:
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);
控制臺(tái)打印輸出結(jié)果如下:
apple
banana
orange
peach
5.IntStream,LongStream和DoubleStream方法
下面的這些XxxStream類(lèi)也具有與Stream類(lèi)等效的方法(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
以上就是Java9新特性Stream流API優(yōu)化與增強(qiáng)的詳細(xì)內(nèi)容,更多關(guān)于Java9新特性Stream API增強(qiáng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Java編程中if...else語(yǔ)句的嵌套寫(xiě)法
這篇文章主要介紹了Java編程中if...else語(yǔ)句的嵌套寫(xiě)法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11java如何實(shí)現(xiàn)socket連接方法封裝
這篇文章主要介紹了java實(shí)現(xiàn)socket連接方法封裝教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09解決myBatis generator逆向生成沒(méi)有根據(jù)主鍵的select,update和delete問(wèn)題
這篇文章主要介紹了解決myBatis generator逆向生成沒(méi)有根據(jù)主鍵的select,update和delete問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離的示例
本文主要介紹了SpringBoot整合sharding-jdbc實(shí)現(xiàn)分庫(kù)分表與讀寫(xiě)分離的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例
這篇文章主要介紹了RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java并發(fā)源碼分析ConcurrentHashMap線程集合
這篇文章主要為大家介紹了Java并發(fā)源碼分析ConcurrentHashMap線程集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02