Java 9 在2017年9月發佈,它不僅是Java 8之後一次重要的更新,更是帶來了許多深刻影響開發方式的變革,尤其是模塊化系統的引入。下面這個表格可以幫助你快速把握其核心特性概覽。
|
特性類別
|
核心亮點
|
主要價值
|
|
模塊化系統 (JPMS) |
引入了模塊 ( |
實現強封裝、精細依賴管理、減小運行時體積 。 |
|
集合工廠方法 |
為 |
創建簡潔安全,線程安全,性能更好 。 |
|
接口私有方法 |
允許在接口中使用 |
提高接口內代碼複用性,減少冗餘 。 |
|
JShell (REPL) |
提供交互式命令行工具,可直接輸入代碼片段並立即查看結果 。 |
快速測試代碼片段,學習語言特性 。 |
|
Stream API 增強 |
新增 |
更精細控制流,簡化迭代操作 。 |
|
Optional 增強 |
新增 |
更優雅處理可能為空對象 。 |
|
進程API增強 |
引入 |
更強大管理操作系統進程 。 |
|
HTTP/2 客户端 |
提供新的標準化HTTP客户端,支持HTTP/2和WebSocket 。 |
替代老舊 |
🔧 核心特性詳解
模塊化系統 (JPMS)
Java 平台模塊系統(JPMS,即 Project Jigsaw)是 Java 9 最具革命性的特性。它旨在解決傳統 JAR 文件在大型應用中面臨的類路徑混亂、依賴隱式暴露和 JRE 臃腫等問題 。
模塊的核心是一個名為 module-info.java的描述文件,放在代碼根目錄下。它明確聲明瞭以下內容 :
requires: 聲明該模塊依賴哪些其他模塊。exports: 聲明該模塊的哪些包可以被其他模塊訪問。未導出的包在模塊外部是不可見的,實現了強封裝 。provides ... with和uses: 用於聲明和服務提供者接口(SPI) 。
一個簡單的模塊定義示例如下:
// module-info.java
module com.mycompany.app {
requires java.sql; // 聲明依賴
exports com.mycompany.app.api; // 只暴露api包,其他包隱藏
}
通過模塊化,你可以使用 jlink工具創建一個只包含應用所需模塊的自定義運行時鏡像,顯著減小部署體積 。
集合工廠方法
Java 9 引入了創建不可變集合的簡便工廠方法,代碼更加簡潔 。
// 創建不可變列表
List<String> list = List.of("A", "B", "C");
// 創建不可變集合
Set<String> set = Set.of("A", "B", "C");
// 創建不可變映射
Map<String, Integer> map = Map.of("Key1", 1, "Key2", 2);
// 或者使用Map.ofEntries創建更多鍵值對
Map<String, Integer> map2 = Map.ofEntries(
Map.entry("Key1", 1),
Map.entry("Key2", 2)
);
這些方法創建的集合是不可變的,嘗試修改會拋出 UnsupportedOperationException。它們相比 Arrays.asList()更具線程安全性,且實現上可能更節省內存 。
接口私有方法
為了解決 Java 8 中接口的默認方法(default方法)可能產生的代碼重複問題,Java 9 允許在接口中定義私有方法 。
public interface MyInterface {
default void methodA() {
commonHelper();
// ... 方法A的特有邏輯
}
default void methodB() {
commonHelper();
// ... 方法B的特有邏輯
}
// 私有幫助方法,被默認方法共享
private void commonHelper() {
// ... 公共邏輯
}
// 也支持私有靜態方法
private static void staticHelper() {
// ... 靜態公共邏輯
}
}
JShell
JShell 提供了一個交互式環境,讓你無需先編寫類定義和 main方法就能快速測試代碼想法 。
$ jshell
| 歡迎使用 JShell -- 版本 9
| 要查看簡介,請鍵入:/help intro
jshell> int x = 10;
x ==> 10
jshell> String greeting = "Hello, JShell!";
greeting ==> "Hello, JShell!"
jshell> System.out.println(greeting + " x is: " + x);
Hello, JShell! x is: 10
jshell> /vars
| int x = 10
| String greeting = "Hello, JShell!"
你可以定義類、方法,導入包,以及使用 /list, /vars, /methods等命令查看狀態 。
Stream API 增強
takeWhile(Predicate)和dropWhile(Predicate): 根據條件處理流。takeWhile會一直取元素直到條件第一次為false,而dropWhile會一直丟棄元素直到條件第一次為false,然後返回剩餘元素 。
Stream.of(1, 2, 3, 4, 2, 1)
.takeWhile(n -> n < 4) // 取出 1, 2, 3 (遇到4時停止)
.forEach(System.out::println);
Stream.of(1, 2, 3, 4, 2, 1)
.dropWhile(n -> n < 4) // 丟棄 1, 2, 3,返回 4, 2, 1
.forEach(System.out::println);
iterate重載: 新增的重載方法允許提供迭代終止條件,類似for循環 。
// 生成一個從0開始,小於10的遞增數列
IntStream.iterate(0, n -> n < 10, n -> n + 1)
.forEach(System.out::println);
Optional 增強
stream(): 將Optional轉換為一個包含值(如果存在)的流,否則返回空流。這在需要將Optional與StreamAPI 結合時非常有用 。
List<Optional<String>> list = Arrays.asList(
Optional.of("A"), Optional.empty(), Optional.of("C"));
List<String> result = list.stream()
.flatMap(Optional::stream) // 將每個Optional轉換為Stream
.collect(Collectors.toList()); // 結果: ["A", "C"]
ifPresentOrElse(): 如果值存在,執行一個操作,否則執行另一個操作 。
optionalValue.ifPresentOrElse(
value -> System.out.println("Found: " + value),
() -> System.out.println("Not found")
);
⚙️ 其他重要更新
Java 9 還包括許多其他值得關注的改進:
- 改進的 Try-With-Resources: 在
try-with-resources語句中,如果資源是final或等效於final的變量,可以直接使用,無需在語句內聲明新變量,使代碼更簡潔 。
// Java 9 之前
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (BufferedReader r = reader) { ... }
// Java 9 及以後
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) { ... } // 直接使用已存在的變量
- 多版本兼容 JAR 包 (Multi-Release JARs): 允許為不同的 Java 版本提供不同的類文件。例如,一個 JAR 包可以同時包含面向 Java 8 和 Java 9 的類實現,從而在保持向後兼容的同時利用新版本特性 。
- HTTP/2 客户端 (標準): 引入了新的 HTTP 客户端 API (
java.net.http包),支持 HTTP/2 和 WebSocket,旨在替代舊的HttpURLConnection。它支持同步和異步調用 。 - 響應式流 (Reactive Streams) API: 在
java.util.concurrent.Flow類中引入了響應式流規範的接口(Publisher,Subscriber,Subscription,Processor),為 Java 平台提供了標準的非阻塞背壓異步流處理基礎 。
🚀 總結與建議
Java 9 的模塊化系統(JPMS)是其最核心的變革,為構建更安全、更健壯和更易維護的大型應用奠定了基礎。而集合工廠方法、接口私有方法、JShell 等特性則從不同層面提升了開發效率和代碼質量 。
儘管 Java 9 本身已結束公開更新,但其引入的許多特性,尤其是模塊化思想,深刻影響了後續 Java 的發展。理解這些特性,特別是模塊化,對於理解現代 Java 應用架構至關重要。
希望這份詳細的介紹能幫助你全面瞭解 Java 9 的新特性。