Java 9 中的 9 個新特性你知道嗎
Java 8 發布三年多之後,即將快到2017年7月下一個版本發布的日期了。 你可能已經聽說過 Java 9 的模塊係統,但是這個新版本還有許多其它的更新。 這裏有九個令人興奮的新功能將與 Java 9 一起發布。
1. Java 平台級模塊係統
Java 9 的定義功能是一套全新的模塊係統。當代碼庫越來越大,創建複雜,盤根錯節的“意大利麵條式代碼”的幾率呈指數級的增長。這時候就得麵對兩個基礎的問題: 很難真正地對代碼進行封裝, 而係統並沒有對不同部分(也就是 JAR 文件)之間的依賴關係有個明確的概念。每一個公共類都可以被類路徑之下任何其它的公共類所訪問到, 這樣就會導致無意中使用了並不想被公開訪問的 API。此外,類路徑本身也存在問題: 你怎麼知曉所有需要的 JAR 都已經有了, 或者是不是會有重複的項呢? 模塊係統把這倆個問題都給解決了。
模塊化的 JAR 文件都包含一個額外的模塊描述器。在這個模塊描述器中, 對其它模塊的依賴是通過 “ requires” 來表示的。另外, “ exports” 語句控製著哪些包是可以被其它模塊訪問到的。所有不被導出的包默認都封裝在模塊的裏麵。如下是一個模塊描述器的示例,存在於 “module-info.java” 文件中:
module blog {
我們可以如下展示模塊:
請注意,兩個模塊都包含封裝的包,因為它們沒有被導出(使用橙色盾牌可視化)。 沒有人會偶然地使用來自這些包中的類。Java 平台本身也使用自己的模塊係統進行了模塊化。通過封裝 JDK 的內部類,平台更安全,持續改進也更容易。
當啟動一個模塊化應用時, JVM 會驗證是否所有的模塊都能使用,這基於 `requires` 語句——比脆弱的類路徑邁進了一大步。模塊允許你更好地強製結構化封裝你的應用並明確依賴。你可以在這個 課程 中學習更多關於 Java 9 中模塊工作的信息 。
如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裏麵可以學習和交流,也有資料可以下載。
2. Linking
當你使用具有顯式依賴關係的模塊和模塊化的 JDK 時,新的可能性出現了。你的應用程序模塊現在將聲明其對其他應用程序模塊的依賴以及對其所使用的 JDK 模塊的依賴。為什麼不使用這些信息創建一個最小的運行時環境,其中隻包含運行應用程序所需的那些模塊呢? 這可以通過 Java 9 中的新的 jlink 工具實現。你可以創建針對應用程序進行優化的最小運行時映像而不需要使用完全加載 JDK 安裝版本。
3. JShell: 交互式 Java REPL
許多語言已經具有交互式編程環境,Java 現在加入了這個俱樂部。您可以從控製台啟動 jshell ,並直接啟動輸入和執行 Java 代碼。 jshell 的即時反饋使它成為探索 API 和嚐試語言特性的好工具。
測試一個 Java 正則表達式是一個很好的說明 jshell 如何使您的生活更輕鬆的例子。 交互式 shell 還可以提供良好的教學環境以及提高生產力,您可以 在此 了解更多信息。在教人們如何編寫 Java 的過程中,不再需要解釋 “public static void main(String [] args)” 這句廢話。
4. 改進的 Javadoc
有時一些小事情可以帶來很大的不同。你是否就像我一樣在一直使用 Google 來查找正確的 Javadoc 頁麵呢? 這不再需要了。Javadoc 現在支持在 API 文檔中的進行搜索。另外,Javadoc 的輸出現在符合兼容 HTML5 標準。此外,你會注意到,每個 Javadoc 頁麵都包含有關 JDK 模塊類或接口來源的信息。
5. 集合工廠方法
通常,您希望在代碼中創建一個集合(例如,List 或 Set ),並直接用一些元素填充它。 實例化集合,幾個 “add” 調用,使得代碼重複。 Java 9,添加了幾種集合工廠方法:
Set<Integer> ints = Set.of(1, 2, 3);
除了更短和更好閱讀之外,這些方法也可以避免您選擇特定的集合實現。 事實上,從工廠方法返回已放入數個元素的集合實現是高度優化的。這是可能的,因為它們是不可變的:在創建後,繼續添加元素到這些集合會導致 “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);
第二個參數是一個 Lambda,它會在當前 IntStream 中的元素到達 100 的時候返回 true。因此這個簡單的示例是向控製台打印 1 到 99。
除了對 Stream 本身的擴展,Optional 和 Stream 之間的結合也得到了改進。現在可以通過 Optional 的新方法 `stram` 將一個 Optional 對象轉換為一個(可能是空的) Stream 對象:
Stream<Integer> s = Optional.of(1).stream();
在組合複雜的 Stream 管道時,將 Optional 轉換為 Stream 非常有用。
7. 私有接口方法
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
如果您使用默認方法開發 API ,那麼私有接口方法可能有助於構建其實現。
8. HTTP/2
Java 9 中有新的方式來處理 HTTP 調用。這個遲到的特性用於代替老舊的 `HttpURLConnection` API,並提供對 WebSocket 和 HTTP/2 的支持。注意:新的 HttpClient API 在 Java 9 中以所謂的孵化器模塊 交付。也就是說,這套 API 不能保證 100% 完成。不過你可以在 Java 9 中開始使用這套 API:
HttpClient client = HttpClient.newHttpClient();
除了這個簡單的請求/響應模型之外,HttpClient 還提供了新的 API 來處理 HTTP/2 的特性,比如流和服務端推送。
最後更新:2017-08-17 15:02:16
上一篇:
雲原生:雲計算時代命題之終極解決方案
下一篇:
《係統分析與設計方法及實踐》一1.1 什麼是軟件
Dart語言遭微軟鄙視 穀歌疏遠盟友必敗
COM數據類型
Error 1 Expected class, delegate, enum, interface, or struct
[Hibernate開發之路](5)聯合主鍵
Chrome 25 被黑客攻破 Google發布緊急更新
java sql編輯器 數據庫備份還原 quartz定時任務調度 java圖片爬蟲
科學音頻處理(三):如何使用 Octave 的高級數學技術處理音頻文件
《Apache Flink官方文檔》 Apache Flink介紹
轉載~ 耐思尼克 http://www.iisp.com/ztview/ID_10895_zh.html 多域名綁定一個空間的方法
Java NIO係列教程(四) Scatter/Gather