????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);
? ? ? }