Java 8 發佈三年多以後,java9已經發布了 。 你可能已經據說過 Java 9 的模塊系統,可是這個新版本還有許多其它的更新。 這裏有九個使人興奮的新功能將與 Java 9 一塊兒發佈。java
Java 8 發佈三年多以後,java9已經發布了 。 你可能已經據說過 Java 9 的模塊系統,可是這個新版本還有許多其它的更新。 這裏有九個使人興奮的新功能將與 Java 9 一塊兒發佈。java
Java 9 的定義功能是一套全新的模塊系統。當代碼庫愈來愈大,建立複雜,盤根錯節的「意大利麪條式代碼」的概率呈指數級的增加。這時候就得面對兩個基礎的問題: 很難真正地對代碼進行封裝, 而系統並無對不一樣部分(也就是 JAR 文件)之間的依賴關係有個明確的概念。每個公共類均可以被類路徑之下任何其它的公共類所訪問到, 這樣就會致使無心中使用了並不想被公開訪問的 API。此外,類路徑自己也存在問題: 你怎麼知曉全部須要的 JAR 都已經有了, 或者是否是會有重複的項呢? 模塊系統把這倆個問題都給解決了。正則表達式
模塊化的 JAR 文件都包含一個額外的模塊描述器。在這個模塊描述器中, 對其它模塊的依賴是經過 「requires」 來表示的。另外, 「exports」 語句控制着哪些包是能夠被其它模塊訪問到的。全部不被導出的包默認都封裝在模塊的裏面。以下是一個模塊描述器的示例,存在於 「module-info.java」 文件中:shell
module blog { exports com.pluralsight.blog; requires cms; }
咱們能夠以下展現模塊:編程
請注意,兩個模塊都包含封裝的包,由於它們沒有被導出(使用橙色盾牌可視化)。 沒有人會偶然地使用來自這些包中的類。Java 平臺自己也使用本身的模塊系統進行了模塊化。經過封裝 JDK 的內部類,平臺更安全,持續改進也更容易。安全
當啓動一個模塊化應用時, JVM 會驗證是否全部的模塊都能使用,這基於 `requires` 語句——比脆弱的類路徑邁進了一大步。模塊容許你更好地強制結構化封裝你的應用並明確依賴。你能夠在這個課程中學習更多關於 Java 9 中模塊工做的信息 。模塊化
當你使用具備顯式依賴關係的模塊和模塊化的 JDK 時,新的可能性出現了。你的應用程序模塊如今將聲明其對其餘應用程序模塊的依賴以及對其所使用的 JDK 模塊的依賴。爲何不使用這些信息建立一個最小的運行時環境,其中只包含運行應用程序所需的那些模塊呢? 這能夠經過 Java 9 中的新的 jlink 工具實現。你能夠建立針對應用程序進行優化的最小運行時映像而不須要使用徹底加載 JDK 安裝版本。工具
許多語言已經具備交互式編程環境,Java 如今加入了這個俱樂部。您能夠從控制檯啓動 jshell ,並直接啓動輸入和執行 Java 代碼。 jshell 的即時反饋使它成爲探索 API 和嘗試語言特性的好工具。學習
測試一個 Java 正則表達式是一個很好的說明 jshell 如何使您的生活更輕鬆的例子。 交互式 shell 還能夠提供良好的教學環境以及提升生產力。在教人們如何編寫 Java 的過程當中,再也不須要解釋 「public static void main(String [] args)」 這句廢話。測試
一般,您但願在代碼中建立一個集合(例如,List 或 Set ),並直接用一些元素填充它。 實例化集合,幾個 「add」 調用,使得代碼重複。 Java 9,添加了幾種集合工廠方法:
Set<Integer> ints = Set.of(1, 2, 3); List<String> strings = List.of("first", "second");
除了更短和更好閱讀以外,這些方法也能夠避免您選擇特定的集合實現。 事實上,從工廠方法返回已放入數個元素的集合實現是高度優化的。這是可能的,由於它們是不可變的:在建立後,繼續添加元素到這些集合會致使 「UnsupportedOperationException」 。
長期以來,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);
第二個參數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。所以這個簡單的示例是向控制檯打印 1 到 99。
除了對 Stream 自己的擴展,Optional 和 Stream 之間的結合也獲得了改進。如今能夠經過 Optional 的新方法 `stram` 將一個 Optional 對象轉換爲一個(多是空的) Stream 對象:
Stream<Integer> s = Optional.of(1).stream();
在組合複雜的 Stream 管道時,將 Optional 轉換爲 Stream 很是有用。
Java 8 爲咱們帶來了接口的默認方法。 接口如今也能夠包含行爲,而不只僅是方法簽名。 可是,若是在接口上有幾個默認方法,代碼幾乎相同,會發生什麼狀況? 一般,您將重構這些方法,調用一個可複用的私有方法。 但默認方法不能是私有的。 將複用代碼建立爲一個默認方法不是一個解決方案,由於該輔助方法會成爲公共API的一部分。 使用 Java 9,您能夠向接口添加私有輔助方法來解決此問題:
public interface MyInterface { void normalInterfaceMethod(); default void interfaceMethodWithDefault() { init(); } default void anotherDefaultMethod() { init(); } // This method is not part of the public API exposed by MyInterface private void init() { System.out.println("Initializing"); } }
若是您使用默認方法開發 API ,那麼私有接口方法可能有助於構建其實現。
Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 `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<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
除了這個簡單的請求/響應模型以外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,好比流和服務端推送。