Java 9 中的 9 個新特性

Java 8 發(fā)布三年多之后闯捎,即將快到2017年7月下一個版本發(fā)布的日期了习劫。 你可能已經(jīng)聽說過 Java 9 的模塊系統(tǒng),但是這個新版本還有許多其它的更新棒口。 這里有九個令人興奮的新功能將與 Java 9 一起發(fā)布寄月。

1. Java 平臺級模塊系統(tǒng)

Java 9 的定義功能是一套全新的模塊系統(tǒng)辜膝。當代碼庫越來越大,創(chuàng)建復雜漾肮,盤根錯節(jié)的“意大利面條式代碼”的幾率呈指數(shù)級的增長厂抖。這時候就得面對兩個基礎的問題: 很難真正地對代碼進行封裝, 而系統(tǒng)并沒有對不同部分(也就是 JAR 文件)之間的依賴關系有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到, 這樣就會導致無意中使用了并不想被公開訪問的 API克懊。此外忱辅,類路徑本身也存在問題: 你怎么知曉所有需要的 JAR 都已經(jīng)有了, 或者是不是會有重復的項呢? 模塊系統(tǒng)把這倆個問題都給解決了。

模塊化的 JAR 文件都包含一個額外的模塊描述器谭溉。在這個模塊描述器中, 對其它模塊的依賴是通過 “requires” 來表示的墙懂。另外, “exports” 語句控制著哪些包是可以被其它模塊訪問到的。所有不被導出的包默認都封裝在模塊的里面扮念。如下是一個模塊描述器的示例损搬,存在于 “module-info.java” 文件中:

module blog {

exports com.pluralsight.blog;

requires cms;

}

我們可以如下展示模塊:

請注意,兩個模塊都包含封裝的包扔亥,因為它們沒有被導出(使用橙色盾牌可視化)场躯。 沒有人會偶然地使用來自這些包中的類。Java 平臺本身也使用自己的模塊系統(tǒng)進行了模塊化旅挤。通過封裝 JDK 的內(nèi)部類踢关,平臺更安全,持續(xù)改進也更容易粘茄。

當啟動一個模塊化應用時签舞, JVM 會驗證是否所有的模塊都能使用,這基于 `requires` 語句——比脆弱的類路徑邁進了一大步柒瓣。模塊允許你更好地強制結構化封裝你的應用并明確依賴儒搭。你可以在這個課程中學習更多關于 Java 9 中模塊工作的信息 。

2. Linking

當你使用具有顯式依賴關系的模塊和模塊化的 JDK 時芙贫,新的可能性出現(xiàn)了搂鲫。你的應用程序模塊現(xiàn)在將聲明其對其他應用程序模塊的依賴以及對其所使用的 JDK 模塊的依賴。為什么不使用這些信息創(chuàng)建一個最小的運行時環(huán)境磺平,其中只包含運行應用程序所需的那些模塊呢魂仍? 這可以通過 Java 9 中的新的 jlink 工具實現(xiàn)。你可以創(chuàng)建針對應用程序進行優(yōu)化的最小運行時映像而不需要使用完全加載 JDK 安裝版本拣挪。

3. JShell : 交互式 Java REPL

許多語言已經(jīng)具有交互式編程環(huán)境擦酌,Java 現(xiàn)在加入了這個俱樂部。您可以從控制臺啟動 jshell 菠劝,并直接啟動輸入和執(zhí)行 Java 代碼赊舶。 jshell 的即時反饋使它成為探索 API 和嘗試語言特性的好工具。

測試一個 Java 正則表達式是一個很好的說明 jshell 如何使您的生活更輕松的例子。 交互式 shell 還可以提供良好的教學環(huán)境以及提高生產(chǎn)力笼平,您可以在此了解更多信息园骆。在教人們?nèi)绾尉帉?Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話寓调。

4. 改進的 Javadoc

有時一些小事情可以帶來很大的不同遇伞。你是否就像我一樣在一直使用 Google 來查找正確的 Javadoc 頁面呢? 這不再需要了捶牢。Javadoc 現(xiàn)在支持在 API 文檔中的進行搜索。另外巍耗,Javadoc 的輸出現(xiàn)在符合兼容 HTML5 標準秋麸。此外,你會注意到炬太,每個 Javadoc 頁面都包含有關 JDK 模塊類或接口來源的信息灸蟆。

5. 集合工廠方法

通常,您希望在代碼中創(chuàng)建一個集合(例如亲族,List 或 Set )炒考,并直接用一些元素填充它。 實例化集合霎迫,幾個 “add” 調(diào)用斋枢,使得代碼重復。 Java 9知给,添加了幾種集合工廠方法:

Set ints = Set.of(1,2,3);

List strings = List.of("first","second");

除了更短和更好閱讀之外瓤帚,這些方法也可以避免您選擇特定的集合實現(xiàn)。 事實上涩赢,從工廠方法返回已放入數(shù)個元素的集合實現(xiàn)是高度優(yōu)化的戈次。這是可能的,因為它們是不可變的:在創(chuàng)建后筒扒,繼續(xù)添加元素到這些集合會導致 “UnsupportedOperationException” 怯邪。

6. 改進的 Stream API

長期以來,Stream API 都是 Java 標準庫最好的改進之一花墩。通過這套 API 可以在集合上建立用于轉換的申明管道悬秉。在 Java 9 中它會變得更好。Stream 接口中添加了 4 個新的方法:dropWhile, takeWhile, ofNullable观游。還有個 iterate 方法的新重載方法搂捧,可以讓你提供一個 Predicate (判斷條件)來指定什么時候結束迭代:

IntStream.iterate(1, i -> i <100, i -> i +1).forEach(System.out::println);

第二個參數(shù)是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true懂缕。因此這個簡單的示例是向控制臺打印 1 到 99允跑。

除了對 Stream 本身的擴展,Optional 和 Stream 之間的結合也得到了改進。現(xiàn)在可以通過 Optional 的新方法 `stram` 將一個 Optional 對象轉換為一個(可能是空的) Stream 對象:

Stream s = Optional.of(1).stream();

在組合復雜的 Stream 管道時聋丝,將 Optional 轉換為 Stream 非常有用索烹。

7. 私有接口方法

Java 8 為我們帶來了接口的默認方法。 接口現(xiàn)在也可以包含行為弱睦,而不僅僅是方法簽名百姓。 但是,如果在接口上有幾個默認方法况木,代碼幾乎相同垒拢,會發(fā)生什么情況? 通常火惊,您將重構這些方法求类,調(diào)用一個可復用的私有方法。 但默認方法不能是私有的屹耐。 將復用代碼創(chuàng)建為一個默認方法不是一個解決方案尸疆,因為該輔助方法會成為公共API的一部分。 使用 Java 9惶岭,您可以向接口添加私有輔助方法來解決此問題:

publicinterfaceMyInterface {

voidnormalInterfaceMethod();

defaultvoidinterfaceMethodWithDefault() {? init(); }

defaultvoidanotherDefaultMethod() { init(); }

// This method is not part of the public API exposed by MyInterface

privatevoidinit() { System.out.println("Initializing"); }

}

如果您使用默認方法開發(fā) API 寿弱,那么私有接口方法可能有助于構建其實現(xiàn)。

8. HTTP/2

Java 9 中有新的方式來處理 HTTP 調(diào)用按灶。這個遲到的特性用于代替老舊的 `HttpURLConnection` API症革,并提供對 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊交付兆衅。也就是說地沮,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:

HttpClient client = HttpClient.newHttpClient();

HttpRequest req =

HttpRequest.newBuilder(URI.create("http://www.google.com"))

.header("User-Agent","Java")

.GET()

.build();

HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());

HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());

除了這個簡單的請求/響應模型之外羡亩,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性摩疑,比如流和服務端推送。

9. 多版本兼容 JAR

我們最后要來著重介紹的這個特性對于庫的維護者而言是個特別好的消息畏铆。當一個新版本的 Java 出現(xiàn)的時候雷袋,你的庫用戶要花費數(shù)年時間才會切換到這個新的版本。這就意味著庫得去向后兼容你想要支持的最老的 Java 版本 (許多情況下就是 Java 6 或者 7)辞居。這實際上意味著未來的很長一段時間楷怒,你都不能在庫中運用 Java 9 所提供的新特性。幸運的是瓦灶,多版本兼容 JAR 功能能讓你創(chuàng)建僅在特定版本的 Java 環(huán)境中運行庫程序時選擇使用的 class 版本:

multirelease.jar

├── META-INF

│?? └── versions

│?????? └──9

│?????????? └── multirelease

│?????????????? └── Helper.class

├── multirelease

├── Helper.class

└── Main.class

在上述場景中鸠删, multirelease.jar 可以在 Java 9 中使用, 不過 Helper 這個類使用的不是頂層的 multirelease.Helper 這個 class, 而是處在“META-INF/versions/9”下面的這個。這是特別為 Java 9 準備的 class 版本贼陶,可以運用 Java 9 所提供的特性和庫刃泡。同時巧娱,在早期的 Java 諸版本中使用這個 JAR 也是能運行的,因為較老版本的 Java 只會看到頂層的這個 Helper 類烘贴。

如你所見禁添,Java 9 提供了一大堆或大或小的功能特性,你準備好了么?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桨踪,一起剝皮案震驚了整個濱河市老翘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锻离,老刑警劉巖铺峭,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汽纠,居然都是意外死亡逛薇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門疏虫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啤呼,你說我怎么就攤上這事卧秘。” “怎么了官扣?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵翅敌,是天一觀的道長。 經(jīng)常有香客問我惕蹄,道長蚯涮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任卖陵,我火速辦了婚禮遭顶,結果婚禮上,老公的妹妹穿的比我還像新娘泪蔫。我一直安慰自己棒旗,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布撩荣。 她就那樣靜靜地躺著铣揉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪餐曹。 梳的紋絲不亂的頭發(fā)上逛拱,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音台猴,去河邊找鬼朽合。 笑死俱两,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的旁舰。 我是一名探鬼主播锋华,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼箭窜!你這毒婦竟也來了毯焕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磺樱,失蹤者是張志新(化名)和其女友劉穎纳猫,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹捉,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡芜辕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了块差。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵续。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憨闰,靈堂內(nèi)的尸體忽然破棺而出状蜗,到底是詐尸還是另有隱情,我是刑警寧澤鹉动,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布轧坎,位于F島的核電站,受9級特大地震影響泽示,放射性物質(zhì)發(fā)生泄漏缸血。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一械筛、第九天 我趴在偏房一處隱蔽的房頂上張望捎泻。 院中可真熱鬧,春花似錦埋哟、人聲如沸族扰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔呵。三九已至,卻和暖如春砍鸠,著一層夾襖步出監(jiān)牢的瞬間扩氢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工爷辱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留录豺,地道東北人朦肘。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像双饥,于是被迫代替她去往敵國和親媒抠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理咏花,服務發(fā)現(xiàn)趴生,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • Java 8可謂是自Java 5以來最具革命性的版本了,她在語言棚菊、編譯器浸踩、類庫、開發(fā)工具以及Java虛擬機等方面都...
    光劍書架上的書閱讀 1,601評論 0 13
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,826評論 6 342
  • 陪我媽去公園散步的時候后裸,身后有兩個女孩子,應該27.8左右冒滩,兩人在討論‘我家里又開始催我了,可我不想相親浪谴,不...
    zydr閱讀 291評論 1 1
  • 心清水現(xiàn)月开睡,意定天無云。 盼望有一天你能來苟耻, 改變不了憂慮篇恒, 只想走出大山, 尋求內(nèi)心的真我凶杖。 放棄人世間種種猶豫...
    顧純熙閱讀 239評論 0 2