最通俗易懂的 Java 11 新特性講解
- 2020 年 3 月 3 日
- 筆記
大多數開發者還是沉浸在 Java 8
中,而 Java 14
將要在 2020 年 3 月 17 日發布了,而我還在寫著 Java 11
的新特性。Java 11
是 Java 8
之後的第一個 LTS 版本,但是也自從 Java 11
開始, Oracle JDK 不再可以免費的用於商業用途,當然如果你是個人使用,或者是使用 Open JDK ,那麼還是可以免費使用的。
有些人很關心
Java 11
是否收費,Oracle 表示除非你在生產中使用,否則可以不用收費。即使收費,免費的 Open JDK 不也很香嗎。
可免費用於生產環境的 Open JDK 官網:https://jdk.java.net/11/
再 6 個月後,Java 15
都要來了,這種發布節奏不僅讓人有點應接不暇,更有點眼花繚亂。但是不管怎麼說,發展的趨勢不可逆,所以補習一波 Java 11
也是很有必要的。
1. String API
字元串絕對是 Java 中最常用的一個類了,String 類的方法使用率也都非常的高,在 Java 11
中又為 String 類帶來了一系列的好用操作。
-
isBlank() 判空。
// 判空,blank里我放入了全形空格,半形空格,TAB String blank = " "; System.out.println(blank.isBlank()); // 輸出 // true
-
lines() 分割獲取字元串流。
// lines 返回一個 Stream String line = "anbnc"; Stream<String> lines = line.lines(); // 使用 lambda 遍歷 lines.forEach(System.out::println); // 輸出 // a // b // c
-
repeat() 複製字元串
// 複製字元串 String repeat = "我的微信:wn8398,"; String repeat3 = repeat.repeat(3); System.out.println(repeat3); // 輸出 // 我的微信:wn8398,我的微信:wn8398,我的微信:wn8398,
-
strip() 去除前後空白字元。
// 去除前後空白 String strip = " https://www.wdbyte.com "; System.out.println("==" + strip.trim() + "=="); // 去除前後空白字元,如全形空格,TAB System.out.println("==" + strip.strip() + "=="); // 去前面空白字元,如全形空格,TAB System.out.println("==" + strip.stripLeading() + "=="); // 去後面空白字元,如全形空格,TAB System.out.println("==" + strip.stripTrailing() + "=="); // 輸出 // == https://www.wdbyte.com == // ==https://www.wdbyte.com== // ==https://www.wdbyte.com == // == https://www.wdbyte.com==
這裡注意,
trim
只能去除半形空格,而strip
是去除各種空白符。
2. File API
讀寫文件變得更加方便。
// 創建臨時文件 Path path = Files.writeString(Files.createTempFile("test", ".txt"), "https://www.wdbyte.com"); System.out.println(path); // 讀取文件 // String ss = Files.readString(Path.of("file.json")); String s = Files.readString(path); System.out.println(s); // 結果 // https://www.wdbyte.com
3. JEP 321 – HTTP Client
在 Java 11
中 Http Client API 得到了標準化的支援。且支援 HTTP/1.1 和 HTTP/2 ,也支援 websockets。
你可以像這樣發起一個請求。
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://www.hao123.com")) .build(); // 非同步 client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println) .join(); // 同步 HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
更多的如同步非同步請求,並發訪問,設置代理等方式,可以參考 OpenJDK 官方文檔。
http://openjdk.java.net/groups/net/httpclient/recipes-incubating.html
你現在還需要各種 HTTP Client 依賴包嗎?
4. JEP 323 – Lambda 局部變數推斷
在 Java 10
中引入了 var
語法,可以自動推斷變數類型。在 Java 11
中這個語法糖可以在 Lambda 表達式中使用了。
var hashMap = new HashMap<String, Object>(); hashMap.put("wechat", "wn8398"); hashMap.put("website", "https://www.wdbyte.com"); hashMap.forEach((var k, var v) -> { System.out.println(k + ": " + v); });
這裡需要注意的是,(var k,var v)
中,k 和 v 的類型要麼都用 var ,要麼都不寫,要麼都寫正確的變數類型。而不能 var 和其他變數類型混用。
5. JEP 330 – 單命令運行 Java
自從學習 Java 的第一天,我們就知道運行一個 Java 文件,要先用 javac
命令編譯,再用 java
命令運行,而現在只要一個 java
命令就可以運行了。
$ cat Main.java public class Main { public static void main(String[] args) { System.out.println("wechat:wn8398"); } } $ java Main.java wechat:wn8398
6. 免費的飛行記錄器
商業版 JDK 中一直有一款低開銷的事件資訊收集工具,也就是飛行記錄器(Java Flight Recorder),它可以對 JVM 進行檢查、分析、記錄等。當出現未知異常時可以通過記錄進行故障分析。這個好用的工具在 Java 11
中將開源免費。所有人都可以使用這個功能了。
其他更新
- JEP 309 – 添加動態文件常量。
- JEP 318 – 添加 Epsilon 垃圾收集器。
- JEP 320 – 刪除 Java EE 和 corba 模組(java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind)。
- JEP 329 – 增加加密演算法 chacha20,poly1305 的實現。
- JEP 333 – 引入實驗性的 ZGC 垃圾收集器,保證停擺時間不會超過 10ms。
- JEP 335 – 廢棄 Nashorn JavaScript 引擎
文章案例都已經上傳到 Github:niumoo/jdk-feature
系列往期
- 最通俗易懂的 Java 10 新特性講解
- Jdk14 都要出了,Jdk9 的新特性還不了解一下?
- 還看不懂同事的程式碼?
- 超強的 Stream 流操作姿勢還不學習一下
- 還看不懂同事的程式碼?Lambda 表達式、函數介面了解一下
- Jdk14 都要出了,還不能使用 Optional優雅的處理空指針?
- Jdk14 都要出了,Jdk8 的時間處理姿勢還不了解一下?
- 還看不懂同事程式碼?快來補一波 Java 7 語法特性
<完>
這篇文章是我的原創文章。如果你也喜歡,可以關注公眾號【未讀程式碼】,不斷推送【原創文章】與你分享。