Java 11 新特性的一些示例(更新中)

更多 Java 高級知識方面的文章,請參見文集《Java 高級知識》


9月25日 Oracle 官方宣布 Java 11 正式發(fā)布。
參考:http://openjdk.java.net/projects/jdk/11/

JDK 11 reached General Availability on 25 September 2018. Production-ready binaries under the GPL are available from Oracle; binaries from other vendors will follow shortly.

JDK 11 Release Notes:http://jdk.java.net/11/release-notes
API Javadoc:https://docs.oracle.com/en/java/javase/11/docs/api/index.html

JDK 11 的新特性包括:做一個簡單分類

本文將結(jié)合一些具體的代碼示例,介紹Java 11 新特性(更新中)。

JDK 11 在 Mac 上的下載及安裝

下載鏈接:
https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html

安裝完成后,可以看到本機(jī)存在了兩個版本的 SDK:


本機(jī)存在了兩個版本的 SDK

如果是通過 IntelliJ IDEA 來開發(fā) Java,需要切換 JDK 的版本和源代碼的 Language Level:


IntelliJ IDEA 切換 JDK 的版本

IntelliJ IDEA 切換源代碼的 Language Level

一些示例

323: Local-Variable Syntax for Lambda Parameters

參考:http://openjdk.java.net/jeps/323

從 JDK 10開始,引入了 var 類型推斷,例如:

var s = "Hello JDK10";
System.out.println(s);

但是它有幾個限制:

  • 只能用于局部變量上
  • 聲明時必須初始化
  • 不能用作方法參數(shù)
  • 不能在 Lambda 表達(dá)式中使用

JDK 11 則允許在 Lambda 表達(dá)式中使用 var,例如:

var numbers = new int[]{1, 2, 3, 4, 5, 6, 7};

int[] subset = Arrays.stream(numbers).filter((var a) -> a > 5).toArray();
for (int i = 0; i < subset.length; i++) {
    System.out.println(subset[i]);
}

321: HTTP Client (Standard)

參考:http://openjdk.java.net/jeps/321

在 JDK 9 中就已經(jīng)引入了 HTTP Client,不過一直處于孵化狀態(tài),到了 JDK 11,HTTP Client API 結(jié)束了孵化狀態(tài),作為一個標(biāo)準(zhǔn) API 提供在 java.net.http 包中。
java.net.http 包參見:https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/package-summary.html

一個示例:

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.baidu.com/"))
        .build();

HttpResponse<String> response =
        client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode());
System.out.println(response.body());

327: Unicode 10

參考:http://openjdk.java.net/jeps/327

關(guān)于 Unicode 10 的標(biāo)準(zhǔn),參見 http://unicode.org/versions/Unicode10.0.0/

Unicode 10.0 adds 8,518 characters, for a total of 136,690 characters. These additions include 4 new scripts, for a total of 139 scripts, as well as 56 new emoji characters.

因此 JDK 11 更新了已有的 API 來支持最新的 Unicode 10 標(biāo)準(zhǔn),主要體現(xiàn)在如下的類:

  • java.lang 包中的 Character, String
  • java.awt.font 包中的 NumericShaper
  • java.text包中的 Bidi, BreakIterator, Normalizer

例如:

String emoj = "\ud83d\ude02\ud83d\ude0d\ud83c\udf89\ud83d\udc4d";
System.out.println(emoj); // ????????

String 類中新的 API

JDK 11 中新增的 String API 包括:

  • public String strip() 去除前后的空格
  • public String stripLeading() 去除前面的空格
  • public String stripTrailing() 去除后面的空格
  • public boolean isBlank() 判斷是否為空,或者只含有空格
  • public Stream<String> lines() 依據(jù) line terminators (\n \r \r\n) 來進(jìn)行分割
  • public String repeat?(int count) 將字符串重復(fù)n次

例如:

String s1 = " Testing ";
System.out.println(s1.strip()); //Testing

String s2 = " Testing ";
System.out.println(s1.stripLeading()); //Testing空格

String s3 = " Testing ";
System.out.println(s1.stripTrailing()); //空格Testing

System.out.println("   ".isBlank()); //true

String s4 = "A\nB\nC";
Stream<String> ss = s4.lines();
ss.forEach(s -> System.out.println(s));

System.out.println("A".repeat(3)); //AAA

330: Launch Single-File Source-Code Programs

參考:http://openjdk.java.net/jeps/330

之前你可以用 java 命令來運(yùn)行一個 Java 二進(jìn)制文件文件,例如 java HelloWorld.class
現(xiàn)在你可以用 java 命令來直接運(yùn)行一個 Java 源代碼文件,例如 java HelloWorld.java,例如:

此命令相當(dāng)于:

javac -d <memory> HelloWorld.java
java -cp <memory> HelloWorld

提供這個功能并不是為了改變 Java 的語言特性,也不是為了將它變?yōu)橐粋€腳本語言。只是為了簡化 Single-File Source-Code 單文件的執(zhí)行流程。

328: Flight Recorder(JFR)

參考:http://openjdk.java.net/jeps/328
Provide a low-overhead data collection framework for troubleshooting Java applications and the HotSpot JVM. 提供了一個低開銷的數(shù)據(jù)收集框架,用來分析 Java 程序和 HotSpot 虛擬機(jī)。

  • Provide APIs for producing and consuming data as events 提供了 API 來生產(chǎn)和消費(fèi)事件 Events
  • Provide a buffer mechanism and a binary data format 提供了緩沖機(jī)制和二進(jìn)制數(shù)據(jù)格式
  • Allow the configuration and filtering of events 允許事件的配置和過濾
  • Provide events for the OS, the HotSpot JVM, and the JDK libraries 提供了針對操作系統(tǒng),虛擬機(jī)和 JDK 類庫的事件

我們可以通過如下的代碼來生產(chǎn)一個 event:

package jdk11;

import jdk.jfr.Description;
import jdk.jfr.Event;
import jdk.jfr.Label;

import java.io.IOException;

@Label("Hello World")
@Description("Helps the programmer getting started")
class HelloWorld extends Event {
    @Label("Message")
    String message;


    public static void main(String... args) throws IOException {
        HelloWorld event = new HelloWorld();
        event.message = "hello, world!";
        event.commit();
    }
}

隨后通過 java -XX:StartFlightRecording=duration=60s,name=Test,filename=recording.jfr,settings=profile jdk11/HelloWorld 來執(zhí)行,會產(chǎn)生一個文件 recording.jfr。

隨后我們可以通過如下代碼來消費(fèi)這個 event:

package jdk11;

import jdk.jfr.consumer.RecordedEvent;
import jdk.jfr.consumer.RecordingFile;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class EventConsumer {

    public static void main(String... args) throws IOException {
        Path p = Paths.get("recording.jfr");
        for (RecordedEvent e : RecordingFile.readAllEvents(p)) {
            System.out.println(e.getStartTime() + " : " + e.getValue("message"));
        }
    }
}

331: Low-Overhead Heap Profiling

參考:http://openjdk.java.net/jeps/331

Provide a low-overhead way of sampling Java heap allocations, accessible via JVMTI. 提供了一個低開銷的方式來對 Java 堆內(nèi)存的分配進(jìn)行采樣。

一些新的 API

TimeUnit

TimeUnit tu = TimeUnit.DAYS;

// 將 50 小時轉(zhuǎn)換為天數(shù)
System.out.println(tu.convert(Duration.ofHours(50))); // 打印2

更新中


引用:
Java 11正式發(fā)布,新特性解讀
Getting Ready for Java 11

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容