上了一天的班了。想必大家都有強烈的周一綜合癥吧。反正我是很強烈的。拖拖拉拉拖了一天,想想欠的債還是要還的。今天就把Java 9新特性示例的下半部分Done了。老慣例,還是會帶上示例代碼的。希望大家能喜歡。
不可變集合類的工廠方法
Java 9 引入一些方便使用的工廠方法,用于創建不可變集合 List,Set,Map 和 Map.Entry 對象。這些高效實用的方法可用來創建空或者非空集合對象。
在 Java SE 8 和更早版本中,我們常用類似 unmodifiableXXX 的集合類方法創建不可變集合對象。舉個例子,比如我們想創建一個不可變的 List 對象,可能使用到****Collections.unmodifiableList****方法。
但是大家也能感受得到,這些 c
ollections.unmodifiableXXX
方法顯得非常冗長乏味。為了克服這些缺陷,Java 9給 List、Set 和 Map 接口分別添加了兩個更加實用的方法。List 和 Set 接口使用
of()
方法創建一個空或者非空的不可變 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 跟大家一樣也是一個發布訂閱型框架,使我們能夠非常簡單地使用 Java 語言就能實現異步的、可拓展的和并行的應用。
Java SE 9 引進下面這些 API 來在基于 Java 語言的應用中開發 Reactive Streams:
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
當然,更多Reactive有關的說明我們會單獨開一個文章來講,畢竟還是很有內容的一個模型。
匿名類中使用Diamond Operator
Java 7中引進了Diamond Operator之后的提高了很多的可讀性和簡化了一些些代碼。然而在 Java 8 中,Diamond 操作器和匿名內部類的使用中存在一些局限性,后來修復了這些問題并準備將其作為 Java 9 的一部分發布出去。這次的Java 9中就包含這個。
Optional類中添加了新的方法
在Java SE 9 添加了一些新的實用方法到
java.util.Optional
類里面。
這里我們用一些簡單的示例來描述其中的一個看起來比較好玩的方法:stream
如果一個值出現在給定 Optional 對象中,stream() 方法可以返回包含該值的一個順序 Stream 對象。否則,將返回一個空 Stream。
stream()
方法已經被添加,并用來在 Optional 對象中使用,如:Stream<Optional> emp = getEmployee(id)
Stream API中添加了dropWhile 和 takeWhile
Java SE 9 中添加了四個非常有用的新方法到
java.util.Stream
接口里面。正如 Stream 作為一個接口類,所有這些新的實現方法都是默認方法。
其中有兩個方法非常重要:dropWhile 和 takeWhile。如果你熟悉 Scala 語言或者其它函數編程語言的話,你一定知道這些方法。他們在寫一些功能樣式代碼時非常有用。例如:
<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()
方法使用一個斷言作為參數,返回給定 Stream 的子集直到斷言語句第一次返回 false。如果第一個值不滿足斷言條件,將返回一個空的 Stream。
強化了 @Deprecated 注釋
在 Java SE 8 和更早版本上,@Deprecated 注解只是一個沒有任何方法的標記類接口。它的作用是標記一個 Java API,可以是 calss,field,method,interface,constructor 等。
在 Java SE 9 中強化了 @Deprecated 注解,來提供更多有關廢棄 API 的介紹信息,同時也提供一個工具來分析項目中的廢棄 API 的靜態使用情況。Java 9 在Deprecated中添加了兩個方法到 Deprecated 接口中來提供服務:forRemoval 和 since。
當然,我們僅僅列出了我們覺得有意思的,其實還有很多很好玩的方法,也希望各位同學能夠跟我們互動,共同進步。這個坑我也算是填上了。