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

更多 Java 高級(jí)知識(shí)方面的文章,請(qǐng)參見(jiàn)文集《Java 高級(jí)知識(shí)》


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 的新特性包括:做一個(gè)簡(jiǎn)單分類

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

JDK 11 在 Mac 上的下載及安裝

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

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


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

如果是通過(guò) IntelliJ IDEA 來(lái)開(kāi)發(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開(kāi)始哩簿,引入了 var 類型推斷,例如:

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

但是它有幾個(gè)限制:

  • 只能用于局部變量上
  • 聲明時(shí)必須初始化
  • 不能用作方法參數(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节榜,不過(guò)一直處于孵化狀態(tài),到了 JDK 11别智,HTTP Client API 結(jié)束了孵化狀態(tài)宗苍,作為一個(gè)標(biāo)準(zhǔn) API 提供在 java.net.http 包中。
java.net.http 包參見(jiàn):https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/package-summary.html

一個(gè)示例:

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),參見(jià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 來(lái)支持最新的 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) 來(lái)進(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 命令來(lái)運(yùn)行一個(gè) Java 二進(jìn)制文件文件挪钓,例如 java HelloWorld.class
現(xiàn)在你可以用 java 命令來(lái)直接運(yùn)行一個(gè) Java 源代碼文件是越,例如 java HelloWorld.java耳舅,例如:

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

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

提供這個(gè)功能并不是為了改變 Java 的語(yǔ)言特性碌上,也不是為了將它變?yōu)橐粋€(gè)腳本語(yǔ)言。只是為了簡(jiǎn)化 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. 提供了一個(gè)低開(kāi)銷的數(shù)據(jù)收集框架馏予,用來(lái)分析 Java 程序和 HotSpot 虛擬機(jī)。

  • Provide APIs for producing and consuming data as events 提供了 API 來(lái)生產(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 允許事件的配置和過(guò)濾
  • Provide events for the OS, the HotSpot JVM, and the JDK libraries 提供了針對(duì)操作系統(tǒng)盔性,虛擬機(jī)和 JDK 類庫(kù)的事件

我們可以通過(guò)如下的代碼來(lái)生產(chǎn)一個(gè) 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();
    }
}

隨后通過(guò) java -XX:StartFlightRecording=duration=60s,name=Test,filename=recording.jfr,settings=profile jdk11/HelloWorld 來(lái)執(zhí)行霞丧,會(huì)產(chǎn)生一個(gè)文件 recording.jfr

隨后我們可以通過(guò)如下代碼來(lái)消費(fèi)這個(gè) 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. 提供了一個(gè)低開(kāi)銷的方式來(lái)對(duì) Java 堆內(nèi)存的分配進(jìn)行采樣冕香。

一些新的 API

TimeUnit

TimeUnit tu = TimeUnit.DAYS;

// 將 50 小時(shí)轉(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悉尾,隨后出現(xiàn)的幾起案子突那,更是在濱河造成了極大的恐慌,老刑警劉巖构眯,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件愕难,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惫霸,警方通過(guò)查閱死者的電腦和手機(jī)猫缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壹店,“玉大人猜丹,你說(shuō)我怎么就攤上這事」杪” “怎么了居触?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)老赤。 經(jīng)常有香客問(wèn)我轮洋,道長(zhǎng),這世上最難降的妖魔是什么抬旺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任弊予,我火速辦了婚禮,結(jié)果婚禮上开财,老公的妹妹穿的比我還像新娘汉柒。我一直安慰自己误褪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布碾褂。 她就那樣靜靜地躺著兽间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪正塌。 梳的紋絲不亂的頭發(fā)上嘀略,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音乓诽,去河邊找鬼帜羊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸠天,可吹牛的內(nèi)容都是我干的讼育。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稠集,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奶段!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起剥纷,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痹籍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后筷畦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體词裤,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鳖宾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼砂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼎文,死狀恐怖渔肩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拇惋,我是刑警寧澤周偎,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站撑帖,受9級(jí)特大地震影響蓉坎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胡嘿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一蛉艾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦勿侯、人聲如沸拓瞪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祭埂。三九已至,卻和暖如春兵钮,著一層夾襖步出監(jiān)牢的瞬間蛆橡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工矢空, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航罗,地道東北人禀横。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓屁药,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柏锄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酿箭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容