JDK11新特性學習(一)

別清兵你會死 發表於 2020-10-30

// JDK9 --> JDK11(LTS)

區域性變數型別推斷

JDK7開始支援的型別推斷:(由左邊推到右邊)

List<String> list = new ArrayList<>();

JDK11的型別推斷:(由右邊推到左邊)

var a = "abc";
// 等價於
String a = "abc";

var不是一個關鍵字,所以無法寫 var n; ,類的屬性無法使用var。

  1. 設定的目的在於減少程式碼量,節約了編碼時間,屬於語法改進。 idea程式碼重構表示不服~

  2. var還可以用在lambda表示式中,用來與註解結合使用(java中註解只能寫在型別前面)

// 這樣就可以定義一個被廢棄的消費者介面
Consumer<String> consumer = (@Deprecated var t) -> System.out.println(t.toUpperCase());

一些增強的API

建立物件

// list1、list2 不可以新增元素 
List<String> list1 = Arrays.asList("1", "2","3");
List<String> list2 = List.of("1", "2","3");
Set<Integer> set = Set.of(100, 8, 8);
  • asList建立的是Arrays這個類的靜態內部類ArrayList,這個內部類沒有add方法,使用的是繼承自AbstractList的add方法,這個方法直接丟擲異常
  • of建立了ImmutableCollections類的ListN,沒有add方法,同樣是建立的只讀集合
  • Set中的of不是新增不了8,而是直接丟擲異常

總結:of方法通常作為建立物件使用。比如Stream.of() LocalTime.of() …

字串處理

String str = "\t  \r\n";
str.isBlank(); // 判斷字串是否為空白  結果為true
str.strip().length();  // 去除字串首尾的空白  結果為0
str.stripTrailing();  // 去除尾部空白
str.stripLeading();  // 去除首部空白
str.repeat(3);    // 重複列印三次字串
str.lines().count();  // 字串切割後變成流,再統計字串行數
  • trim()是去除字串首尾的空白。本質是去除碼值≤32的空白字元,漢語等語言的空格沒辦法去除!!
  • " \t abc \n ".trim().length() 結果是6(字串裡包含了一個全形的空格)

檔案流

InputStream有了個transferTo方法,可以直接將資料傳輸到OutputStream
我們在進行原始資料複製的時候不用再考慮中間的過程

// 將file1拷貝到file2
var c1 = this.getClass().getClassLoader();
var inputStream = c1.getResourceAsStream("./file1");
try(var outputStream = new OutputStream("./file2")) {
	inputStream.transferTo(outputStream); // 輸入流的資料直接複製到輸出流
}
inputStream.close();