Java11新特性

北京時間9月26號Java11如期而至,包含了Java9、Java10全部功能, 雖說短期之內不可能投入生產使用,但是作爲一名Javaer,還是很有必要了解Java9-11的一些新特性的。傳送門:http://jdk.java.net/11/

1.jshell

下載之後解壓到某個目錄,進入該目錄下的bin目錄地址欄輸入cmd,打開命令行後輸入jshell:

就可以像python交互模式那樣直接運行代碼了:

2.一個命令編譯運行源代碼

要運行一個 Java 源代碼必須先編譯,再運行,兩步執行動作。而在Java 11 版本中,通過一個 java 命令就直接搞定了,如以下所示。

// 編譯
javac Java11.java

// 運行
java Java11
// 一條命令即可
java Java11.java

3.局部類型推斷

var str = "Hello Java11";
System.out.print(str); // Hello Java11

4.String字符串操作方法

lines()方法 一次性將字符串按照換行符分割並返回所有行的流

var str = "Java11";
System.out.println(str.lines()); // java.util.stream.ReferencePipeline$Head@5ec0a365

將流轉化爲數組,我們只要調用 ReferencePipeline 類的 toArray() 方法即可

System.out.println(str.lines().toArray()); // Object[1] { "Java11" }

repeat() 方法將字符串重複指定次數,如果傳遞的是負數,則會拋出異常,如果傳遞的是 0 ,那麼就返回空字符串了

System.out.println("Java11".repeat(3)); // Java11Java11Java11

isBlank 用於判斷字符串是否全部都是空白符,需要注意的是,Java 語言使用 UTF-8 編碼,所有 UTF-8 被視爲空白符的,在 Java 中也一樣

var halfSpace = "\u0020";
System.out.println(halfSpace);
System.out.println(halfSpace.isBlank()); // true
System.out.println("\u3000");
System.out.println("\u3000".isBlank()); // true


strip()	刪除字符串頭尾的所有空白符
stripLeading()	刪除字符串左邊 ( 頭部 ) 的所有空白符
stripTrailing()	刪除字符串右邊 ( 尾部 ) 的所有空白符
System.out.println("-" + " Java11 ".strip() + "-"); // - Java11 -
System.out.println(" Java11 ".stripLeading() + "-"); // Java11 -
System.out.println(" Java11 ".stripTrailing() + "-"); // - Java

5.集合加強

自 Java 9 開始,Jdk 裏面爲集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它們兩個都用來創建不可變的集合

var list = List.of("Java11", "Java10", "Java9");
var copy = List.copyOf(list);
System.out.println(list == copy);  // true
var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy);  // false

注意:使用 of 和 copyOf 創建的集合爲不可變集合,不能進行添加、刪除、替換、排序等操作,不然會報 java.lang.UnsupportedOperationException 異常。

6.Stream 加強

Java 9 開始對 Stream 增加了以下 4 個新方法。

  1. 增加單個參數構造方法,可爲null
Stream.ofNullable(null).count(); // 0
  1. 增加 takeWhile 和 dropWhile 方法
Stream.of(1, 2, 3, 2, 1).takeWhile(n -> n < 3).collect(Collectors.toList());  // [1, 2]

從開始計算,當 n < 3 時就截止。

Stream.of(1, 2, 3, 2, 1).dropWhile(n -> n < 3).collect(Collectors.toList());  // [3, 2, 1]

一旦 n < 3 不成立就開始計算

3)iterate重載

這個 iterate 方法的新重載方法,可以讓你提供一個 Predicate (判斷條件)來指定什麼時候結束迭代。

7.Optional 加強

Optional.of("Java11").orElseThrow();     // java11
Optional.of("Java11").stream().count();  // 1
Optional.ofNullable(null).or(() -> Optional.of("Java11")).get();   // java11

8.InputStream 加強

InputStream 終於有了一個非常有用的方法:transferTo,可以用來將數據直接傳輸到 OutputStream,這是在處理原始數據流時非常常見的一種用法

var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("Java11.txt");
var javastack = File.createTempFile("Java11.1", "txt");
try (var outputStream = new FileOutputStream(javastack)) {
    inputStream.transferTo(outputStream);
}

9.HTTP Client API

這是 Java 9 開始引入的一個處理 HTTP 請求的的孵化 HTTP Client API,該 API 支持同步和異步,而在 Java 11 中已經爲正式可用狀態,你可以在 java.net 包中找到這個 API。

var request = HttpRequest.newBuilder()
    .uri(URI.create("https://javastack.cn"))
    .GET()
    .build();
var client = HttpClient.newHttpClient();

// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

// 異步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

PS: IntelliJ IDEA 2018.2開始支持Java11了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章