Java 11 正式發(fā)布,8 個逆天新特性

原文來自:Java 11 正式發(fā)布胧卤,這 8 個逆天新特性教你寫出更牛逼的代碼

原創(chuàng): R哥 Java技術(shù)棧

09 月 25 日唯绍,Oralce 正式發(fā)布了 Java 11,這是據(jù) Java 8 以后支持的首個長期版本枝誊。

為什么說是長期版本况芒,看下面的官方發(fā)布的支持路線圖表。

image

可以看出 Java 8 擴展支持到 2025 年叶撒,而 Java 11 擴展支持到 2026 年绝骚。

現(xiàn)在大部分都在用 Java 8耐版,Java 9 和 10 目前很少有人在用,至少我沒有發(fā)現(xiàn)有公司在生產(chǎn)環(huán)境應(yīng)用的皮壁,那就是找死椭更。

現(xiàn)在 Java 11 長期支持哪审,也已經(jīng)包含了 9 和 10 的全部功能蛾魄,9 和 10 自然就活到頭了。湿滓。

那么我們來看下 從 Java 9 - 11 都有哪些重要的新特性呢滴须?

1、本地變量類型推斷

這個博主已經(jīng)寫過一篇文章叽奥,詳細(xì)的介紹了 Java 10 帶來的這個新特性扔水。

什么是局部變量類型推斷?

var javastack = "javastack";
System.out.println(javastack);

大家看出來了朝氓,局部變量類型推斷就是左邊的類型直接使用 var 定義魔市,而不用寫具體的類型,編譯器能根據(jù)右邊的表達(dá)式自動推斷類型赵哲,如上面的 String 待德。

var javastack = "javastack";

就等于:

String javastack = "javastack";

更多使用詳情請參考這篇文章《Java 10 實戰(zhàn)第 1 篇:局部變量類型推斷》,這里不再重復(fù)了枫夺。

2将宪、字符串加強

Java 11 增加了一系列的字符串處理方法,如以下所示橡庞。

// 判斷字符串是否為空白
" ".isBlank(); // true

// 去除首尾空格
" Javastack ".strip(); // "Javastack"

// 去除尾部空格 
" Javastack ".stripTrailing(); // " Javastack"

// 去除首部空格 
" Javastack ".stripLeading(); // "Javastack "

// 復(fù)制字符串
"Java".repeat(3); // "JavaJavaJava"

// 行數(shù)統(tǒng)計
"A\nB\nC".lines().count(); // 3

3较坛、集合加強

自 Java 9 開始,Jdk 里面為集合(List/ Set/ Map)都添加了 ofcopyOf 方法扒最,它們兩個都用來創(chuàng)建不可變的集合丑勤,來看下它們的使用和區(qū)別。

示例1:

var list = List.of("Java", "Python", "C");
var copy = List.copyOf(list);
System.out.println(list == copy);  // true

示例2:

var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy);  // false

示例1和2代碼差不多吧趣,為什么一個為true,一個為false?

來看下它們的源碼:

static <E> List<E> of(E... elements) {
    switch (elements.length) { // implicit null check of elements
        case 0:
            return ImmutableCollections.emptyList();
        case 1:
            return new ImmutableCollections.List12<>(elements[0]);
        case 2:
            return new ImmutableCollections.List12<>(elements[0], elements[1]);
        default:
            return new ImmutableCollections.ListN<>(elements);
    }
}

static <E> List<E> copyOf(Collection<? extends E> coll) {
    return ImmutableCollections.listCopy(coll);
}

static <E> List<E> listCopy(Collection<? extends E> coll) {
    if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
        return (List<E>)coll;
    } else {
        return (List<E>)List.of(coll.toArray());
    }
}

可以看出 copyOf 方法會先判斷來源集合是不是 AbstractImmutableList 類型的法竞,如果是,就直接返回再菊,如果不是爪喘,則調(diào)用 of 創(chuàng)建一個新的集合。

示例2因為用的 new 創(chuàng)建的集合纠拔,不屬于不可變 AbstractImmutableList 類的子類秉剑,所以 copyOf 方法又創(chuàng)建了一個新的實例,所以為false.

注意:使用 of 和 copyOf 創(chuàng)建的集合為不可變集合稠诲,不能進(jìn)行添加侦鹏、刪除诡曙、替換、排序等操作略水,不然會報 java.lang.UnsupportedOperationException 異常价卤。

上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有渊涝。

4慎璧、Stream 加強

Stream 是 Java 8 中的新特性,Java 9 開始對 Stream 增加了以下 4 個新方法跨释。

  1. 增加單個參數(shù)構(gòu)造方法眨业,可為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]

從開始計算卜高,當(dāng) 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 (判斷條件)來指定什么時候結(jié)束迭代弃锐。

如果你對 JDK 8 中的 Stream 還不熟悉懦铺,可以看之前分享的這一系列教程。

5贯要、Optional 加強

Opthonal 也增加了幾個非撑龋酷的方法,現(xiàn)在可以很方便的將一個 Optional 轉(zhuǎn)換成一個 Stream, 或者當(dāng)一個空 Optional 時給它一個替代的郭毕。

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

6它碎、InputStream 加強

InputStream 終于有了一個非常有用的方法:transferTo,可以用來將數(shù)據(jù)直接傳輸?shù)?OutputStream显押,這是在處理原始數(shù)據(jù)流時非常常見的一種用法扳肛,如下示例。

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

7乘碑、HTTP Client API

這是 Java 9 開始引入的一個處理 HTTP 請求的的孵化 HTTP Client API挖息,該 API 支持同步和異步,而在 Java 11 中已經(jīng)為正式可用狀態(tài)兽肤,你可以在 java.net 包中找到這個 API套腹。

來看一下 HTTP Client 的用法:

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);

上面的 .GET() 可以省略,默認(rèn)請求方式為 Get资铡!

更多使用示例可以看這個 API电禀,后續(xù)有機會再做演示。

現(xiàn)在 Java 自帶了這個 HTTP Client API笤休,我們以后還有必要用 Apache 的 HttpClient 工具包嗎尖飞?

8、化繁為簡,一個命令編譯運行源代碼

看下面的代碼政基。

// 編譯
javac Javastack.java

// 運行
java Javastack

在我們的認(rèn)知里面贞铣,要運行一個 Java 源代碼必須先編譯,再運行沮明,兩步執(zhí)行動作辕坝。而在未來的 Java 11 版本中,通過一個 java 命令就直接搞定了荐健,如以下所示酱畅。

java Javastack.java

更多新特性

  • Flow API for reactive programming

  • Java Module System

  • Application Class Data Sharing

  • Dynamic Class-File Constants

  • Java REPL (JShell)

  • Flight Recorder

  • Unicode 10

  • G1: Full Parallel Garbage Collector

  • ZGC: Scalable Low-Latency Garbage Collector

  • Epsilon: No-Op Garbage Collector

  • Deprecate the Nashorn JavaScript Engine

結(jié)束語

現(xiàn)在許多人還在使用 Java 8 或者 7,不過 8 在 2019 年初就會結(jié)束免費更新〈萆龋現(xiàn)在 11 是長期支持版本圣贸,正是學(xué)習(xí)和上手 11 的好時機挚歧,寫這篇文章希望能對你有所啟發(fā)扛稽。

部分推廣內(nèi)容被省略
原文來自:Java 11 正式發(fā)布,這 8 個逆天新特性教你寫出更牛逼的代碼
原創(chuàng): R哥 Java技術(shù)棧

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滑负,一起剝皮案震驚了整個濱河市在张,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矮慕,老刑警劉巖帮匾,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痴鳄,居然都是意外死亡瘟斜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門痪寻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螺句,“玉大人,你說我怎么就攤上這事橡类∩呱校” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵顾画,是天一觀的道長取劫。 經(jīng)常有香客問我,道長研侣,這世上最難降的妖魔是什么谱邪? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庶诡,結(jié)果婚禮上惦银,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好璧函,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布傀蚌。 她就那樣靜靜地躺著,像睡著了一般蘸吓。 火紅的嫁衣襯著肌膚如雪善炫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天库继,我揣著相機與錄音箩艺,去河邊找鬼。 笑死宪萄,一個胖子當(dāng)著我的面吹牛艺谆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拜英,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼静汤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了居凶?” 一聲冷哼從身側(cè)響起虫给,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侠碧,沒想到半個月后抹估,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡弄兜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年药蜻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片替饿。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡语泽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盛垦,到底是詐尸還是另有隱情湿弦,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布腾夯,位于F島的核電站颊埃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝶俱。R本人自食惡果不足惜班利,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榨呆。 院中可真熱鬧罗标,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宙拉,卻和暖如春宾尚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谢澈。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工煌贴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锥忿。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓牛郑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敬鬓。 傳聞我的和親對象是個殘疾皇子淹朋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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