上了一天的班了。想必大家都有強烈的周一綜合癥吧责球。反正我是很強烈的焦履。拖拖拉拉拖了一天,想想欠的債還是要還的雏逾。今天就把Java 9新特性示例的下半部分Done了嘉裤。老慣例,還是會帶上示例代碼的栖博。希望大家能喜歡屑宠。
不可變集合類的工廠方法
Java 9 引入一些方便使用的工廠方法,用于創(chuàng)建不可變集合 List仇让,Set侨把,Map 和 Map.Entry 對象。這些高效實用的方法可用來創(chuàng)建空或者非空集合對象妹孙。
在 Java SE 8 和更早版本中秋柄,我們常用類似 unmodifiableXXX 的集合類方法創(chuàng)建不可變集合對象。舉個例子蠢正,比如我們想創(chuàng)建一個不可變的 List 對象骇笔,可能使用到****Collections.unmodifiableList****方法。
但是大家也能感受得到嚣崭,這些 c
ollections.unmodifiableXXX
方法顯得非常冗長乏味笨触。為了克服這些缺陷,Java 9給 List雹舀、Set 和 Map 接口分別添加了兩個更加實用的方法芦劣。List 和 Set 接口使用
of()
方法創(chuàng)建一個空或者非空的不可變 List 或 Set 對象。
空的List的可以寫成:List nullableList = List.of();
非空的List可以寫成:List normalList = List.of("cat","dog","human");
空的Map可以寫成:Map emptyMap = Map.of();
非空的Map的寫法很Cool说榆,是這樣的:Map normalMap = Map.of(1, "one", 2, "two", 3, "three")
Reactive Streams風格的引進
在滿世界都在說Reactive Programming超級厲害的時候虚吟,Java 9也算是與時俱進。跟上了大部隊签财。Java 9 Reactive Streams API 跟大家一樣也是一個發(fā)布訂閱型框架串慰,使我們能夠非常簡單地使用 Java 語言就能實現(xiàn)異步的、可拓展的和并行的應(yīng)用唱蒸。
Java SE 9 引進下面這些 API 來在基于 Java 語言的應(yīng)用中開發(fā) Reactive Streams:
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
當然邦鲫,更多Reactive有關(guān)的說明我們會單獨開一個文章來講,畢竟還是很有內(nèi)容的一個模型神汹。
匿名類中使用Diamond Operator
Java 7中引進了Diamond Operator之后的提高了很多的可讀性和簡化了一些些代碼庆捺。然而在 Java 8 中古今,Diamond 操作器和匿名內(nèi)部類的使用中存在一些局限性,后來修復了這些問題并準備將其作為 Java 9 的一部分發(fā)布出去滔以。這次的Java 9中就包含這個沧卢。
Optional類中添加了新的方法
在Java SE 9 添加了一些新的實用方法到
java.util.Optional
類里面。
這里我們用一些簡單的示例來描述其中的一個看起來比較好玩的方法:stream
如果一個值出現(xiàn)在給定 Optional 對象中醉者,stream() 方法可以返回包含該值的一個順序 Stream 對象但狭。否則,將返回一個空 Stream撬即。
stream()
方法已經(jīng)被添加立磁,并用來在 Optional 對象中使用,如:Stream<Optional> emp = getEmployee(id)
Stream API中添加了dropWhile 和 takeWhile
Java SE 9 中添加了四個非常有用的新方法到
java.util.Stream
接口里面剥槐。正如 Stream 作為一個接口類唱歧,所有這些新的實現(xiàn)方法都是默認方法。
其中有兩個方法非常重要:dropWhile 和 takeWhile粒竖。如果你熟悉 Scala 語言或者其它函數(shù)編程語言的話颅崩,你一定知道這些方法。他們在寫一些功能樣式代碼時非常有用蕊苗。例如:
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: normal; color: rgb(34, 34, 34); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 ).forEach(System.out::println);</pre>
這個
takeWhile()
方法使用一個斷言作為參數(shù)沿后,返回給定 Stream 的子集直到斷言語句第一次返回 false。如果第一個值不滿足斷言條件朽砰,將返回一個空的 Stream尖滚。
強化了 @Deprecated 注釋
在 Java SE 8 和更早版本上,@Deprecated 注解只是一個沒有任何方法的標記類接口瞧柔。它的作用是標記一個 Java API漆弄,可以是 calss,field造锅,method撼唾,interface,constructor 等哥蔚。
在 Java SE 9 中強化了 @Deprecated 注解倒谷,來提供更多有關(guān)廢棄 API 的介紹信息,同時也提供一個工具來分析項目中的廢棄 API 的靜態(tài)使用情況肺素。Java 9 在Deprecated中添加了兩個方法到 Deprecated 接口中來提供服務(wù):forRemoval 和 since恨锚。
當然,我們僅僅列出了我們覺得有意思的倍靡,其實還有很多很好玩的方法,也希望各位同學能夠跟我們互動课舍,共同進步塌西。這個坑我也算是填上了他挎。