Java 9 新特性深入詳解

Java 9 新特性

Oracle 在2017年3月底左右發(fā)布了Java新版本:Java SE9太援。Java 9 作為一個(gè)重要的發(fā)布版本為我們開發(fā)者帶來了非常多的新特性幅骄。因此劫窒,后期我會(huì)陸續(xù)發(fā)表一系列有關(guān)Java SE 9新功能的文章。今天借用這篇文章作為大綱昌执,帶著大家一起來總覽一下 Java 9 提供的新特性烛亦。

關(guān)于 Java 10 的新特性诈泼,請(qǐng)參閱Java 10 新特性深入詳解這篇文章懂拾。

Java 9 REPL (JShell)

Oracle 公司推出了一種名為jshell的新工具 REPL (Read Evaluate Print Loop)。 我們可以稱之為 Java Shell铐达。 用它可以非常容易地執(zhí)行和測(cè)試任何Java 代碼岖赋,如類,接口瓮孙,枚舉唐断,對(duì)象,語句等杭抠。
我們可以從https://jdk9.java.net/download/下載JDK 9 EA軟件脸甘。

G:\>jshell
|  Welcome to JShell -- Version 9-ea
|  For an introduction type: /help intro


jshell> int a = 10
a ==> 10

jshell> System.out.println("a value = " + a )
a value = 10

如果您想進(jìn)一步了解REPL工具,請(qǐng)閱讀Java 9:REPL功能一Java 9:REPL功能二偏灿。

Immutable Collection Factory

Oracle 引入了一系列便捷的工廠方法來創(chuàng)建不可變List丹诀,SetMapMap.Entry等對(duì)象翁垂。這些實(shí)用的工廠方法方便我們創(chuàng)建空或非空的Collection對(duì)象铆遭。

Java SE 8以及更早版本中,我們可以使用諸如unmodifiableXXX之類的集合類提供的方法來創(chuàng)建Immutable Collection對(duì)象沿猜。例如枚荣,如果我們要?jiǎng)?chuàng)建一個(gè)不可變List,則可以使用Collections.unmodifiableList方法啼肩。

但是橄妆,這些Collections.unmodifiableXXX方法是一種繁瑣而冗長(zhǎng)的衙伶。為了克服這些缺點(diǎn),Oracle向List害碾,SetMap接口添加了一些實(shí)用的便捷方法痕支。
List和Set接口使用 of()方法來創(chuàng)建一個(gè)空的或非空的不可變List或Set對(duì)象,如下所示:
空List示例

List immutableList = List.of();

非空List示例

List immutableList = List.of("one","two","three");

Map有兩組方法:of()方法和ofEntries()方法蛮原,分別用于創(chuàng)建Immutable Map對(duì)象和Immutable Map.Entry對(duì)象卧须。

空Map示例

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

非空Map示例

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}

如果您想了解有關(guān)這些實(shí)用方法的更多信息,請(qǐng)參閱以下文章:

Private methods in Interfaces

Java SE 8中儒陨,我們可以在接口里使用DefaultStatic方法花嘶。 但是,我們不能在接口中創(chuàng)建Private方法蹦漠。

為了避免代碼冗余和提高代碼的可重用性椭员,Oracle在Java SE 9接口中引入私有方法。 從Java SE 9開始笛园,我們也可以使用private關(guān)鍵字在接口中編寫私有方法和私有靜態(tài)方法隘击。
這些私有方法類似于其他類的私有方法,它們之間沒有區(qū)別研铆。

public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

如果您想了解更多有關(guān)此新功能的信息埋同,請(qǐng)?jiān)L問以下鏈接:
Java 9:接口中的私有方法

Java 9 模塊系統(tǒng)

模塊系統(tǒng)是Java 9最大的一次變化。 Oracle公司在Jigsaw Project引入以下功能:

  • 模塊化JDK
  • 模塊化Java源代碼
  • 模塊化運(yùn)行時(shí)映像
  • 封裝Java內(nèi)部API
  • Java平臺(tái)模塊系統(tǒng)

在Java SE 9版本之前棵红,我們使用Monolithic Jars開發(fā)基于Java的應(yīng)用程序凶赁。這種體系結(jié)構(gòu)有很多局限性和缺點(diǎn)。為避免所有這些缺點(diǎn)逆甜,Java SE 9引入了模塊虱肄。

JDK 9隨附92個(gè)模塊(后續(xù)版本中可能會(huì)更改)。我們可以使用JDK本身自帶的模塊交煞,也可以創(chuàng)建自己的模塊咏窿,如下所示:

module com.foo.bar { }

在這里,我們使用module來創(chuàng)建一個(gè)簡(jiǎn)單的模塊素征。每個(gè)模塊都有一個(gè)名稱相關(guān)代碼和其他資源集嵌。
要擴(kuò)展閱讀此新特性的更多詳細(xì)信息,請(qǐng)參考下面羅列出來的3篇文章:

改進(jìn)進(jìn)程API

Java SE 9在Process API中進(jìn)行了一些改進(jìn)稚茅。他們添加了一些新的類和方法來簡(jiǎn)化OS進(jìn)程的控制和管理纸淮。
在Java SE 9 中提供了2個(gè)新的類:

  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info

示例代碼:

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());

改進(jìn) Try With Resource

我們知道,Java SE 7引入了一種新的異常處理結(jié)構(gòu):Try-With-Resources以自動(dòng)管理資源亚享。
Java SE 9對(duì)該語句進(jìn)行一些改進(jìn)咽块,以避免迪馬的冗長(zhǎng)和提高可讀性。

Java 7 示例:

void testARM_Before_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (BufferedReader reader2 = reader1) {
   System.out.println(reader2.readLine());
 }
}

Java 9 示例:

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}

要閱讀有關(guān)此新功能的更多信息欺税,請(qǐng)瀏覽我的擴(kuò)展教程: Java 9:Try-With-Resources 的改進(jìn)

CompletableFuture API

在Java SE 9中侈沪,Oracle 改進(jìn)了CompletableFuture API以解決Java SE 8中提出的一些問題揭璃。添加一些實(shí)用的方法以支持延遲和超時(shí)操作以及如何更好的子類化。

Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

這里的delayExecutor()是一個(gè)靜態(tài)方法亭罪,用于返回新的Executor瘦馍,該Executor在給定的延遲后將任務(wù)提交給默認(rèn)的執(zhí)行程序。

響應(yīng)式流

如今应役,響應(yīng)式編程由于它的諸多好處在開發(fā)中變的越來越流行情组,比如:Scala,Play箩祥,Akka等等一些語言/框架都用到了Reactive Streams院崇。 同樣,Oracle在Java SE 9中也引入了新的Reactive Streams API袍祖。

Java SE 9 Reactive Streams API是一個(gè)發(fā)布/訂閱框架底瓣,使得Java語言能夠非常輕松地實(shí)現(xiàn)異步,可伸縮和并行操作蕉陋。

Java SE 9引入了以下API捐凭,以在基于Java的應(yīng)用程序中開發(fā)響應(yīng)流。

  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor
    關(guān)于 Reactive Streams的更多詳細(xì)信息請(qǐng)參考我的另外一篇文章Java 9:響應(yīng)式流操作

改進(jìn) Optional 類

在Java SE 9中凳鬓,Oracle 向java.util.Optional類添加了一些有用的新方法茁肠。 在這里,我將通過一些簡(jiǎn)單的示例來討論其中一種方法:流方法

如果給定的Optional對(duì)象中存在一個(gè)值村视,則此stream()方將返回一個(gè)具有該值的順序Stream官套,否則它將返回一個(gè)空Stream。

如下示例展示了添加stream()方法來延遲對(duì)可選對(duì)象:

Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

這里的Optional.stream()用于將Employee的Optional的Stream對(duì)象轉(zhuǎn)換為Employee的Stream蚁孔,以便我們可以在結(jié)果代碼中延遲處理此結(jié)果。

如果您需要通過更多示例了解Optional功能和更多關(guān)于添加到Optional類的新方法惋嚎,請(qǐng)參閱我的擴(kuò)展教程:Java 9:Optional 類的改進(jìn)

流API的改進(jìn)

在Java SE 9中杠氢,Oracle 向java.util.Stream接口添加了四個(gè)有用的新方法。因?yàn)镾tream是接口另伍,所以所有這些新實(shí)現(xiàn)的方法都是默認(rèn)方法鼻百。其中有兩個(gè)非常重要的方法:dropWhile()takeWhile()

如果您熟悉Scala語言或任何Function編程語言摆尝,則一定會(huì)對(duì)這些方法有所了解温艇。這些是編寫某些功能代碼的非常有用的方法。讓我們?cè)谶@里討論一下takeWhile()方法堕汞。

takeWhile()將謂詞(predicate)作為參數(shù)勺爱,并返回給定Stream值的子集Stream,直到該謂詞第一次返回false為止讯检。 如果第一個(gè)值不滿足該謂詞琐鲁,則僅返回一個(gè)空Stream卫旱。

jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
                 .forEach(System.out::println);
1
2
3
4

要閱讀有關(guān)takeWhile()dropWhile()方法以及其他新方法的更多信息,請(qǐng)我的擴(kuò)展教程:Java 9:Stream API的改進(jìn)

對(duì)@Deprecated 注解的增強(qiáng)

Java SE 8和更早版本中围段,@Deprecated注解只是一個(gè)Marker接口顾翼,沒有任何方法。 它用于標(biāo)記Java API的類奈泪,字段适贸,方法,接口涝桅,構(gòu)造函數(shù)取逾,枚舉等。

在Java SE 9中苹支,Oracle 增強(qiáng)了@Deprecated注解砾隅,以提供給相關(guān)已棄用的API的更多信息,并提供一種工具來分析應(yīng)用程序?qū)σ褩売玫腁PI的使用情況债蜜。 該注解為已廢棄的接口添加了兩種方法:forRemovalsince晴埂。

HTTP 2 客戶端

在Java SE 9中,Oracle 發(fā)布了新的HTTP 2 Client API寻定,以支持HTTP / 2協(xié)議WebSocket功能儒洛。 由于現(xiàn)有的或舊式的HTTP客戶端API存在許多問題(例如只支持HTTP / 1.1協(xié)議,并不支持HTTP / 2協(xié)議和WebSocket狼速,僅在阻塞模式下工作琅锻,并且存在很多性能問題。)向胡,Oracle將HttpURLConnection API替換為新的HTTP Client恼蓬。

Oracle在java.net.http包下引入一個(gè)新的HTTP 2客戶端API。 它同時(shí)支持HTTP / 1.1HTTP / 2協(xié)議僵芹。 同時(shí)支持同步(阻止模式)和異步模式处硬。 而且使用WebSocket API來支持異步模式。

我們可以在https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html上看到新的API拇派。

HTTP 2 Client 示例

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html

jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d

jshell> System.out.println("Response was " + response.body(asString()))

請(qǐng)參閱我的擴(kuò)展教程:Java SE 9:HTTP 2 Client荷辕,以了解HTTP / 2協(xié)議和WebSocket,新API的優(yōu)點(diǎn)以及老 API的缺點(diǎn)件豌,并提供了一些有用的示例疮方。

多分辨率圖像API

在Java SE 9中,Oracle 引入了一個(gè)新的Multi-Resolution Image API茧彤。 此API中的重要接口是MultiResolutionImage骡显。 你可以在java.awt.image包中看到它。

MultiResolutionImage封裝了一組具有不同高度和寬度(即不同分辨率)的圖像,并允許我們根據(jù)需求查詢它們蟆盐。

其它的一些Java 9 特性

在該部分中承边,我只是列出一些Java SE 9的其他新功能。 這并不是說這些功能不是那么重要石挂。 通過一些有用的示例博助,它們對(duì)于理解它們也非常重要和有用。

截至目前痹愚,我還沒有足夠的時(shí)間來擴(kuò)展講解這些特性富岳。 后續(xù)我將逐一介紹這些功能,并通過簡(jiǎn)短的討論和示例將其添加到上面部分中拯腮。 后期再單獨(dú)詳細(xì)寫各自的功能窖式。

  • GC (Garbage Collector) Improvements
  • Stack-Walking API
  • Filter Incoming Serialization Data
  • Deprecate the Applet API
  • Indify String Concatenation
  • Enhanced Method Handles
  • Java Platform Logging API and Service
  • Compact Strings
  • Parser API for Nashorn
  • Javadoc Search
  • HTML5 Javadoc
    后續(xù)我將逐一介紹這些Java 9的功能,并用更多的描述和示例來更新它們动壤。

即以此文獻(xiàn)給那些Java愛好者們萝喘,歡迎大家圍觀。

原文鏈接:https://www.journaldev.com/13121/java-9-features-with-examples

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琼懊,一起剝皮案震驚了整個(gè)濱河市阁簸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哼丈,老刑警劉巖启妹,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異醉旦,居然都是意外死亡饶米,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門车胡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檬输,“玉大人,你說我怎么就攤上這事吨拍⊥拭停” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵羹饰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碳却,道長(zhǎng)队秩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任昼浦,我火速辦了婚禮馍资,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘关噪。我一直安慰自己鸟蟹,他們只是感情好乌妙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著建钥,像睡著了一般藤韵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熊经,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天泽艘,我揣著相機(jī)與錄音,去河邊找鬼镐依。 笑死匹涮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的槐壳。 我是一名探鬼主播然低,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼务唐!你這毒婦竟也來了雳攘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤绍哎,失蹤者是張志新(化名)和其女友劉穎来农,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崇堰,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沃于,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了海诲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片繁莹。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖特幔,靈堂內(nèi)的尸體忽然破棺而出咨演,到底是詐尸還是另有隱情,我是刑警寧澤蚯斯,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布薄风,位于F島的核電站,受9級(jí)特大地震影響拍嵌,放射性物質(zhì)發(fā)生泄漏遭赂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一横辆、第九天 我趴在偏房一處隱蔽的房頂上張望撇他。 院中可真熱鬧,春花似錦、人聲如沸困肩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌畸。三九已至勇劣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹋绽,已是汗流浹背芭毙。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸耘,地道東北人退敦。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚣抗,于是被迫代替她去往敵國(guó)和親侈百。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容