Java9新特性

????Java 9 發(fā)布于 2017 年 9 月 22 日斜棚,帶來了很多新特性句狼,其中最主要的變化是已經(jīng)實現(xiàn)的模塊化系統(tǒng)造挽。接下來我們會詳細介紹 Java 9 的新特性。

特性

模塊系統(tǒng):模塊是一個包的容器学歧,Java 9 最大的變化之一是引入了模塊系統(tǒng)(Jigsaw 項目)。

REPL (JShell):交互式編程環(huán)境各吨。

HTTP 2 客戶端:HTTP/2標準是HTTP協(xié)議的最新版本枝笨,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服務器推送特性。

改進的 Javadoc:Javadoc 現(xiàn)在支持在 API 文檔中的進行搜索揭蜒。另外横浑,Javadoc 的輸出現(xiàn)在符合兼容 HTML5 標準。

多版本兼容 JAR 包:多版本兼容 JAR 功能能讓你創(chuàng)建僅在特定版本的 Java 環(huán)境中運行庫程序時選擇使用的 class 版本屉更。

集合工廠方法:List徙融,Set 和 Map 接口中,新的靜態(tài)工廠方法可以創(chuàng)建這些集合的不可變實例瑰谜。

私有接口方法:在接口中使用private私有方法张咳。我們可以使用 private 訪問修飾符在接口中編寫私有方法。

進程 API: 改進的 API 來控制和管理操作系統(tǒng)進程似舵。引進 java.lang.ProcessHandle 及其嵌套接口 Info 來讓開發(fā)者逃離時常因為要獲取一個本地進程的 PID 而不得不使用本地代碼的窘境脚猾。

改進的 Stream API:改進的 Stream API 添加了一些便利的方法,使流處理更容易砚哗,并使用收集器編寫復雜的查詢龙助。

改進 try-with-resources:如果你已經(jīng)有一個資源是 final 或等效于 final 變量,您可以在 try-with-resources 語句中使用該變量,而無需在 try-with-resources 語句中聲明一個新變量蛛芥。

改進的棄用注解 @Deprecated:注解 @Deprecated 可以標記 Java API 狀態(tài)提鸟,可以表示被標記的 API 將會被移除,或者已經(jīng)破壞仅淑。

改進鉆石操作符(Diamond Operator)?:匿名類可以使用鉆石操作符(Diamond Operator)称勋。

改進 Optional 類:java.util.Optional 添加了很多新的有用方法,Optional 可以直接轉(zhuǎn)為 stream涯竟。

多分辨率圖像 API:定義多分辨率圖像API赡鲜,開發(fā)者可以很容易的操作和展示不同分辨率的圖像了空厌。

改進的 CompletableFuture API?: CompletableFuture 類的異步機制可以在 ProcessHandle.onExit 方法退出時執(zhí)行操作。

輕量級的 JSON API:內(nèi)置了一個輕量級的JSON API银酬。

響應式流(Reactive Streams) API: Java 9中引入了新的響應式流 API 來支持 Java 9 中的響應式編程嘲更。

1、模塊系統(tǒng)

????模塊就是代碼和數(shù)據(jù)的封裝體揩瞪。模塊的代碼被組織成多個包赋朦,每個包中包含Java類和接口;模塊的數(shù)據(jù)則包括資源文件和其他靜態(tài)信息李破。Java 9 模塊的重要特征是在其工件(artifact)的根目錄中包含了一個描述模塊的 module-info.class 文 件宠哄。 工件的格式可以是傳統(tǒng)的 JAR 文件或是 Java 9 新增的 JMOD 文件。這個文件由根目錄中的源代碼文件 module-info.java 編譯而來嗤攻。該模塊聲明文件可以描述模塊的不同特征琳拨。

//在 module-info.java 文件中,可以用新的關(guān)鍵詞module來聲明一個模塊:module com.module {...}

//在 src同級目錄下創(chuàng)建mods文件夾屯曹,然后在該目錄下創(chuàng)建 com.runoob.greetings 文件夾狱庇,將模塊編譯到該目錄下。

2恶耽、REPL(JShell):

????JShell 是 Java 9 新增的一個交互式的編程環(huán)境工具密任。它允許你無需使用類或者方法包裝來執(zhí)行 Java 語句。它與 Python 的解釋器類似偷俭,可以直接 輸入表達式并查看其執(zhí)行結(jié)果浪讳。

3、javadoc 工具:

????可以生成 Java 文檔涌萤, Java 9 的 javadoc 的輸出現(xiàn)在符合兼容 HTML5 標準淹遵。

4、多版本兼容 JAR 包

? ??使用多版本兼容 JAR 功能將 java 文件生成兩個版本的 jar 包, 一個是 jdk 7负溪,另一個是 jdk 9透揣,然后在不同環(huán)境下執(zhí)行。

5川抡、集合工廠方法:

????Java 9 List辐真,Set 和 Map 接口中,新的靜態(tài)工廠方法可以創(chuàng)建這些集合的不可變實例崖堤。

//List 和 Set 接口, of(...) 方法重載了 0 ~ 10 個參數(shù)的不同方法 侍咱。

//Map 接口, of(...) 方法重載了 0 ~ 10 個參數(shù)的不同方法 。

//Map 接口如果超過 10 個參數(shù), 可以使用 ofEntries(...) 方法密幔。

6楔脯、私有接口方法:

? ??在 Java 8之前,接口可以有常量變量和抽象方法胯甩。不能在接口中提供方法實現(xiàn)昧廷。如果要提供抽象方法和非抽象方法(方法與實現(xiàn))的組合堪嫂,那么就得使用抽象類。

? ??在 Java 8 接口引入了一些新功能——默認方法和靜態(tài)方法麸粮。我們可以在Java SE 8的接口中編寫方法實現(xiàn)溉苛,僅僅需要使用?default?關(guān)鍵字來定義它們镜廉。

? ??Java 9 不僅像 Java 8 一樣支持接口默認方法弄诲,同時還支持私有方法。

7娇唯、改進的進程 API:

? ??在 Java 9 之前齐遵,Process API 仍然缺乏對使用本地進程的基本支持。

? ??Java 9 向 Process API 添加了一個名為 ProcessHandle 的接口來增強 java.lang.Process 類塔插。

? ??ProcessHandle 接口的實例標識一個本地進程梗摇,允許查詢進程狀態(tài)并管理進程。

????ProcessHandle 嵌套接口 Info 來讓開發(fā)者逃離時常因為要獲取一個本地進程的 PID 而不得不使用本地代碼的窘境想许。

? ??ProcessHandle 接口中聲明的 onExit() 方法可用于在某個進程終止時觸發(fā)某些操作伶授。

8、改進的 Stream API:

????Java 9 為 Stream 新增了幾個方法:dropWhile流纹、takeWhile糜烹、ofNullable,為 iterate 方法新增了一個重載方法漱凝。

? ? takeWhile() 方法使用一個斷言作為參數(shù)疮蹦,返回給定 Stream 的子集直到斷言語句第一次返回 false。如果第一個值不滿足斷言條件茸炒,將返回一個空的 Stream愕乎。

takeWhile() 方法在有序的 Stream 中,takeWhile 返回從開頭開始的盡量多的元素壁公;在無序的 Stream 中感论,takeWhile 返回從開頭開始的符合 Predicate 要求的元素的子集。

Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty()) .forEach(System.out::print);//碰到空字符串時停止循環(huán)輸出紊册。

Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty()) .forEach(System.out::print);//碰到空字符串時開始循環(huán)輸出

count = Stream.ofNullable(null).count();//空元素返回空流笛粘,輸出0,非空元素則獲取一個元素并生成單個元素流湿硝。

9薪前、改進的 try-with-resources:

? ??try-with-resources 是 JDK 7 中一個新的異常處理機制,它能夠很容易地關(guān)閉在 try-catch 語句塊中使用的資源关斜。

? ??try-with-resources 聲明在 JDK 9 已得到改進示括。如果已經(jīng)有一個資源是 final 或等效于 final 變量,您可以在 try-with-resources 語句中使用該變量,而無需在 try-with-resources 語句中聲明一個新變量痢畜。

10垛膝、@Deprecated (since=""/forRemoval="")

????標記 Java API 狀態(tài)鳍侣,可以是以下幾種:

????????使用它存在風險,可能導致錯誤

????????可能在未來版本中不兼容

????????可能在未來版本中刪除

????????一個更好和更高效的方案已經(jīng)取代它吼拥。

????Java 9 中注解增加了兩個新元素:since?和?forRemoval倚聚。

? ??????since: 元素指定已注解的API元素已被棄用的版本。

? ??????forRemoval: 元素表示注解的 API 元素在將來的版本中被刪除凿可,應該遷移 API惑折。

11、鉆石操作符(Diamond Operator):

????在 java 7 中引入的枯跑,可以讓代碼更易讀惨驶,但它不能用于匿名的內(nèi)部類。

????在 java 9 中敛助, 可以與匿名的內(nèi)部類一起使用粗卜。

12、改進的 Optional 類:

????在 java 9 中, 添加了三個方法來改進它的功能:stream()纳击,ifPresentOrElse()续扔,or()。

? ??stream 方法的作用就是將 Optional 轉(zhuǎn)為一個 Stream焕数,如果該 Optional 中包含值纱昧,那么就返回包含這個值的 Stream,否則返回一個空的 Stream(Stream.empty())百匆。

//語法public Stream<T> stream()

? ??ifPresentOrElse 方法的改進就是有了 else砌些,接受兩個參數(shù) Consumer 和 Runnable。ifPresentOrElse 方法的用途是加匈,如果一個 Optional 包含值存璃,則對其包含的值調(diào)用函數(shù) action,即 action.accept(value)雕拼,這與 ifPresent 一致纵东;與 ifPresent 方法的區(qū)別在于,ifPresentOrElse 還有第二個參數(shù) emptyAction —— 如果 Optional 不包含值啥寇,那么 ifPresentOrElse 便會調(diào)用 emptyAction偎球,即 emptyAction.run()。

//語法public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

? ? or()方法如果值存在辑甜,返回 Optional 指定的值衰絮,否則返回一個預設(shè)的值。

//語法public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

13磷醋、多分辨率圖像的API:

? ??Image getResolutionVariant(double destImageWidth, double destImageHeight)?? 獲取特定分辨率的圖像變體-表示一張已知分辨率單位為DPI的特定尺寸大小的邏輯圖像猫牡,并且這張圖像是最佳的變體。

// 根據(jù)不同尺寸獲取對應的圖像分辨率 Image variant1 = multiResolutionImage.getResolutionVariant(156, 45);

? ? ? System.out.printf("\nImage for destination[%d,%d]: [%d,%d]",

? ? ? ? 156, 45, variant1.getWidth(null), variant1.getHeight(null));

? ??List<Image> getResolutionVariants()?? 返回可讀的分辨率的圖像變體列表邓线。

List<Image> variants = multiResolutionImage.getResolutionVariants();

? ? ? System.out.println("Total number of images: " + variants.size());

? ? ? for (Image img : variants) {? ? ? ? System.out.println(img);

? ? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淌友,一起剝皮案震驚了整個濱河市煌恢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震庭,老刑警劉巖瑰抵,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異器联,居然都是意外死亡二汛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門主籍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來习贫,“玉大人逛球,你說我怎么就攤上這事千元。” “怎么了颤绕?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵幸海,是天一觀的道長。 經(jīng)常有香客問我奥务,道長物独,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任氯葬,我火速辦了婚禮挡篓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帚称。我一直安慰自己官研,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布闯睹。 她就那樣靜靜地躺著戏羽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楼吃。 梳的紋絲不亂的頭發(fā)上始花,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音孩锡,去河邊找鬼酷宵。 笑死,一個胖子當著我的面吹牛躬窜,可吹牛的內(nèi)容都是我干的浇垦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼斩披,長吁一口氣:“原來是場噩夢啊……” “哼溜族!你這毒婦竟也來了讹俊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤煌抒,失蹤者是張志新(化名)和其女友劉穎仍劈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寡壮,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贩疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了况既。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片这溅。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棒仍,靈堂內(nèi)的尸體忽然破棺而出悲靴,到底是詐尸還是另有隱情,我是刑警寧澤莫其,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布癞尚,位于F島的核電站,受9級特大地震影響乱陡,放射性物質(zhì)發(fā)生泄漏浇揩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一憨颠、第九天 我趴在偏房一處隱蔽的房頂上張望胳徽。 院中可真熱鬧,春花似錦爽彤、人聲如沸养盗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爪瓜。三九已至,卻和暖如春匙瘪,著一層夾襖步出監(jiān)牢的瞬間铆铆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工丹喻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薄货,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓碍论,卻偏偏與公主長得像谅猾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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