最通俗易懂的 Java 11 新特性講解


大多數開發者還是沉浸在 Java 8 中,而 Java 14 將要在 2020 年 3 月 17 日發布了,而我還在寫著 Java 11 的新特性。Java 11Java 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 類帶來了一系列的好用操作。

  1. isBlank() 判空。

    // 判空,blank里我放入了全角空格,半角空格,TAB
    String blank = "    ";
    System.out.println(blank.isBlank());
    
    // 輸出
    // true
    
  2. lines() 分割獲取字符串流。

    // lines 返回一個 Stream
    String line = "a\nb\nc";
    Stream<String> lines = line.lines();
    // 使用 lambda 遍歷
    lines.forEach(System.out::println);
    
    // 輸出
    // a
    // b
    // c
    
  3. repeat() 復制字符串

    // 復制字符串
    String repeat = "我的微信:wn8398,";
    String repeat3 = repeat.repeat(3);
    System.out.println(repeat3);
    
    // 輸出
    // 我的微信:wn8398,我的微信:wn8398,我的微信:wn8398,
    
  4. 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 官方文檔。

//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 和其他變量類型混用。

Lambda 中 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 中將開源免費。所有人都可以使用這個功能了。

其他更新

  1. JEP 309 - 添加動態文件常量。
  2. JEP 318 - 添加 Epsilon 垃圾收集器。
  3. JEP 320 - 刪除 Java EE 和 corba ??椋╦ava.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind)。
  4. JEP 329 - 增加加密算法 chacha20,poly1305 的實現。
  5. JEP 333 - 引入實驗性的 ZGC 垃圾收集器,保證停擺時間不會超過 10ms。
  6. JEP 335 - 廢棄 Nashorn JavaScript 引擎

文章案例都已經上傳到 Github:niumoo/jdk-feature

系列往期

<完>
這篇文章是我的原創文章。如果你也喜歡,可以關注公眾號【未讀代碼】,不斷推送【原創文章】與你分享。

posted @ 2020-03-03 09:00  未讀代碼  閱讀(...)  評論(...編輯  收藏