Java 11正式發(fā)布踏拜,這幾個(gè)逆天新特性教你寫出更牛逼的代碼

就在前段時(shí)間,Oracle 官方宣布 Java 11 (18.9 LTS) 正式發(fā)布荚虚,可在生產(chǎn)環(huán)境中使用! 這無疑對(duì)我們來說是一大好的消息薛夜。作為一名java開發(fā)者來說,雖然又要去學(xué)習(xí)和了解java11版述,但內(nèi)心還是欣慰的梯澜。我想至少你和我一樣的心情:Java在手,天下我有渴析!

今天我們來看一下Java 11到底是什么晚伙、他有什么特別的、到底要不要升級(jí)到Java 11俭茧。

Java 11有什么特別的

在Oracle官網(wǎng)中咆疗,進(jìn)入下載頁面,第一個(gè)可供下載的JDK版本已經(jīng)提換成了Java SE 11 (LTS)恢恼,這里的LTS表示Long-Term-Support民傻。

本次發(fā)布的Java 11和2017年9月份發(fā)布的Java 9以及 2018年3月份發(fā)布的Java 10相比,其最大的區(qū)別就是:在長期支持(Long-Term-Support)方面,Oracle表示會(huì)對(duì)Java 11提供大力支持漓踢,這一支持將會(huì)持續(xù)至2026年9月牵署。這是據(jù) Java 8 以后支持的首個(gè)長期版本。

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

上圖是一張Oracle 公布的對(duì)于各個(gè)版本的JDK的Support Roadmap。途中列舉了Java 6 - Java 12的正式發(fā)布時(shí)間以及支持計(jì)劃挺据。

從中可以看出取具,在Java 11之前,Java 9和Java 10是不提供長期支持的扁耐,而上一個(gè)提供長期支持的版本是Java 8暇检,其將會(huì)支持到2025年3月。

長期支持婉称,表示Oracle會(huì)對(duì)其做長期的補(bǔ)丁块仆、安全等擴(kuò)展支持等。

下一個(gè)提供長期支持的版本將會(huì)是Java 17王暗,其將于2021年發(fā)布悔据。

現(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依许、本地變量類型推斷

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

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

大家看出來了,局部變量類型推斷就是左邊的類型直接使用 var 定義峭跳,而不用寫具體的類型膘婶,編譯器能根據(jù)右邊的表達(dá)式自動(dòng)推斷類型,如上面的 String 蛀醉。

var javastack = "javastack"; 

就等于:

String javastack = "javastack"; 

2悬襟、字符串加強(qiáng)

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

// 判斷字符串是否為空白  

" ".isBlank();                // true  

// 去除首尾空格  

" Javastack ".strip();          // "Javastack"  

// 去除尾部空格   

" Javastack ".stripTrailing();  // " Javastack"  

// 去除首部空格   

" Javastack ".stripLeading();   // "Javastack "  

// 復(fù)制字符串  

"Java".repeat(3);             // "JavaJavaJava"  

// 行數(shù)統(tǒng)計(jì)  

"A\nB\nC".lines().count();    // 3 

3脊岳、集合加強(qiáng)

自 Java 9 開始,Jdk 里面為集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它們兩個(gè)都用來創(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代碼差不多,為什么一個(gè)為true,一個(gè)為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 方法會(huì)先判斷來源集合是不是 AbstractImmutableList 類型的亿驾,如果是嘹黔,就直接返回,如果不是莫瞬,則調(diào)用 of 創(chuàng)建一個(gè)新的集合儡蔓。

示例2因?yàn)橛玫?new 創(chuàng)建的集合,不屬于不可變 AbstractImmutableList 類的子類疼邀,所以 copyOf 方法又創(chuàng)建了一個(gè)新的實(shí)例喂江,所以為false.

注意:使用 of 和 copyOf 創(chuàng)建的集合為不可變集合,不能進(jìn)行添加旁振、刪除开呐、替換、排序等操作规求,不然會(huì)報(bào) java.lang.UnsupportedOperationException 異常筐付。

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

4瓦戚、Stream 加強(qiáng)

Stream 是 Java 8 中的新特性,Java 9 開始對(duì) Stream 增加了以下 4 個(gè)新方法丛塌。

  1. 增加單個(gè)參數(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] 

從開始計(jì)算,當(dāng) n < 3 時(shí)就截止赴邻。

Stream.of(1, 2, 3, 2, 1)  

    .dropWhile(n -> n < 3)  

    .collect(Collectors.toList());  // [3, 2, 1] 

這個(gè)和上面的相反印衔,一旦 n < 3 不成立就開始計(jì)算。

3)iterate重載

這個(gè) iterate 方法的新重載方法姥敛,可以讓你提供一個(gè) Predicate (判斷條件)來指定什么時(shí)候結(jié)束迭代奸焙。

如果你對(duì) JDK 8 中的 Stream 還不熟悉,可以看之前分享的這一系列教程彤敛。

5与帆、Optional 加強(qiáng)

Opthonal 也增加了幾個(gè)非常酷的方法墨榄,現(xiàn)在可以很方便的將一個(gè) Optional 轉(zhuǎn)換成一個(gè) Stream, 或者當(dāng)一個(gè)空 Optional 時(shí)給它一個(gè)替代的玄糟。

Optional.of("javastack").orElseThrow();     // javastack  

Optional.of("javastack").stream().count();  // 1  

Optional.ofNullable(null)  

    .or(() -> Optional.of("javastack"))  

    .get();   // javastack 

6、InputStream 加強(qiáng)

InputStream 終于有了一個(gè)非常有用的方法:transferTo袄秩,可以用來將數(shù)據(jù)直接傳輸?shù)?OutputStream阵翎,這是在處理原始數(shù)據(jù)流時(shí)非常常見的一種用法逢并,如下示例。

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 開始引入的一個(gè)處理 HTTP 請(qǐng)求的的孵化 HTTP Client API筒狠,該 API 支持同步和異步,而在 Java 11 中已經(jīng)為正式可用狀態(tài)箱沦,你可以在 java.net 包中找到這個(gè) 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)請(qǐng)求方式為 Get谓形!

更多使用示例可以看這個(gè) API灶伊,后續(xù)有機(jī)會(huì)再做演示。

現(xiàn)在 Java 自帶了這個(gè) HTTP Client API寒跳,我們以后還有必要用 Apache 的 HttpClient 工具包嗎莲蜘?

8拘领、化繁為簡叉信,一個(gè)命令編譯運(yùn)行源代碼

看下面的代碼栓始。

// 編譯  
javac Javastack.java  


// 運(yùn)行  
java Javastack 

在我們的認(rèn)知里面,要運(yùn)行一個(gè) Java 源代碼必須先編譯书释,再運(yùn)行翘贮,兩步執(zhí)行動(dòng)作。而在未來的 Java 11 版本中爆惧,通過一個(gè) java 命令就直接搞定了狸页,如以下所示。

java Javastack.java 

更多新特性

新發(fā)布的Java 11在新特性方面扯再,提供了17個(gè)JEP(JDK Enhancement Proposal 特性增強(qiáng)提議)

上圖是Oracle公布的Java 11包含的所有新特性芍耘,其中幾個(gè)重點(diǎn)的新特性為:

ZGC:可擴(kuò)展的低延遲垃圾收集器

ZGC是一款號(hào)稱可以保證每次GC的停頓時(shí)間不超過10MS的垃圾回收器,并且和當(dāng)前的默認(rèn)垃圾回收起G1相比熄阻,吞吐量下降不超過15%斋竞。

Epsilon:什么事也不做的垃圾回收器

Java 11還加入了一個(gè)比較特殊的垃圾回收器——Epsilon,該垃圾收集器被稱為“no-op”收集器秃殉,將處理內(nèi)存分配而不實(shí)施任何實(shí)際的內(nèi)存回收機(jī)制坝初。 也就是說,這是一款不做垃圾回收的垃圾回收器复濒。這個(gè)垃圾回收器看起來并沒什么用脖卖,主要可以用來進(jìn)行性能測(cè)試、內(nèi)存壓力測(cè)試等巧颈,Epsilon GC可以作為度量其他垃圾回收器性能的對(duì)照組。大神Martijn說袖扛,Epsilon GC至少能夠幫助理解GC的接口砸泛,有助于成就一個(gè)更加模塊化的JVM十籍。

增強(qiáng)var用法

Java 10中增加了本地變量類型推斷的特性,可以使用var來定義局部變量唇礁。盡管這一特性被很多人詬病勾栗,但是并不影響Java繼續(xù)增強(qiáng)他的用法,在Java 11中盏筐,var可以用來作為Lambda表達(dá)式的局部變量聲明围俘。

移除Java EE和CORBA模塊

早在發(fā)布Java SE 9的時(shí)候,Java就表示過琢融,會(huì)在未來版本中將Java EE和CORBA模塊移除界牡,而這樣舉動(dòng)終于在Java 11中實(shí)施。終于去除了Java EE和CORBA模塊漾抬。

HTTP客戶端進(jìn)一步升級(jí)

JDK 9 中就已對(duì) HTTP Client API 進(jìn)行標(biāo)準(zhǔn)化宿亡,然后通過JEP 110,在 JDK 10 中進(jìn)行了更新纳令。在本次的Java 11的更新列表中挽荠,由以JEP 321進(jìn)行進(jìn)一步升級(jí)。該API通過CompleteableFutures提供非阻塞請(qǐng)求和響應(yīng)語義平绩,可以聯(lián)合使用以觸發(fā)相應(yīng)的動(dòng)作圈匆。 JDK 11完全重寫了該功能。現(xiàn)在捏雌,在用戶層請(qǐng)求發(fā)布者和響應(yīng)發(fā)布者與底層套接字之間追蹤數(shù)據(jù)流更容易了臭脓,這降低了復(fù)雜性,并最大程度上提高了HTTP / 1和HTTP / 2之間的重用的可能性腹忽。

到底要不要升級(jí)

2017年8月来累,JCP執(zhí)行委員會(huì)提出將Java的發(fā)布頻率改為每六個(gè)月一次。

  • 2017年9月窘奏,Java 9發(fā)布嘹锁。
  • 2018年3月,Java 10發(fā)布着裹。
  • 2018年9月领猾,Java 11發(fā)布。

大部分人使用的JDK版本還是Java 8及以下版本骇扇,甚至某些公司的生產(chǎn)環(huán)境使用的還是JDK 1.6摔竿。

那么,對(duì)于公司和開發(fā)者來說少孝,到底要不要在生產(chǎn)及開發(fā)環(huán)境中升級(jí)和學(xué)習(xí)Java 11呢?

對(duì)于企業(yè)來說

對(duì)于企業(yè)來說继低,生產(chǎn)環(huán)境中的JDK版本升級(jí)到Java 11還是有必要的。主要有兩個(gè)原因:

1稍走、Oracle會(huì)對(duì)Java 11提供長期支持袁翁,企業(yè)可以放心使用這一版本柴底。并且下一個(gè)長期支持的版本會(huì)在三年后發(fā)布,時(shí)間比較久遠(yuǎn)粱胜。

2柄驻、Java 11確實(shí)提供了一些比較不錯(cuò)的特性,尤其重要的是提供了ZGC焙压,這是一款具有劃時(shí)代意義的垃圾回收器鸿脓。優(yōu)點(diǎn)不再贅述。有了ZGC涯曲,JVM的性能瓶頸可以被突破野哭。

對(duì)于開發(fā)者來說

在編碼方面,Java 11并沒有像Java 8那樣變化巨大掀抹,畢竟Java 8提供了函數(shù)式編程的能力虐拓,這也是很多開發(fā)者學(xué)習(xí)Java 8的一個(gè)重要原因。

但是傲武,Java 11也并不是完全沒有提升蓉驹,至少在新版本中,Java開發(fā)者終于可以擺脫老舊的HttpURLConnection了揪利。新的HTTP API提供了對(duì)HTTOP/2等業(yè)界前沿標(biāo)準(zhǔn)的支持态兴,提供了精簡而又友好的API接口。

所以疟位,綜上所述瞻润,無論是對(duì)于企業(yè)還是開發(fā)者來說,升級(jí)Java 11都是有必要的甜刻,至少比Java 9和Java 10的必要性要大很多绍撞。至于這個(gè)必要性到底有多大呢,作者給一個(gè)簡單的說明:

  • 如果你現(xiàn)在時(shí)候用的JDK/Java版本低于Java 8得院,先升級(jí)到Java 8傻铣。
  • 如果你現(xiàn)在時(shí)候用的JDK/Java版本高于Java 7,那么可以考慮升級(jí)到Java 11了祥绞。
    當(dāng)然非洲,你可以直接從Java 6跳躍到Java 11。

最后

現(xiàn)在許多人還在使用 Java 8 或者 7蜕径,不過 8 在 2019 年初就會(huì)結(jié)束免費(fèi)更新×教ぃ現(xiàn)在 11 是長期支持版本,正是學(xué)習(xí)和上手 11 的好時(shí)機(jī)兜喻,寫這篇文章希望能對(duì)你有所啟發(fā)梦染。

閱讀更多

還有這種操作?淺析為什么要看源碼

上次發(fā)版我就改了一行代碼!

MongoDB虹统、Hbase弓坞、Redis等NoSQL優(yōu)劣勢(shì)隧甚、應(yīng)用場(chǎng)景

31道Android面試題 车荔,牢固你的基礎(chǔ)渡冻!

相信自己,沒有做不到的忧便,只有想不到的

在這里獲得的不僅僅是技術(shù)族吻!

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市珠增,隨后出現(xiàn)的幾起案子超歌,更是在濱河造成了極大的恐慌,老刑警劉巖蒂教,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍举,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凝垛,警方通過查閱死者的電腦和手機(jī)懊悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梦皮,“玉大人炭分,你說我怎么就攤上這事〗?希” “怎么了捧毛?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長让网。 經(jīng)常有香客問我呀忧,道長,這世上最難降的妖魔是什么溃睹? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任而账,我火速辦了婚禮,結(jié)果婚禮上丸凭,老公的妹妹穿的比我還像新娘福扬。我一直安慰自己,他們只是感情好惜犀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布铛碑。 她就那樣靜靜地躺著,像睡著了一般虽界。 火紅的嫁衣襯著肌膚如雪汽烦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天莉御,我揣著相機(jī)與錄音撇吞,去河邊找鬼俗冻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牍颈,可吹牛的內(nèi)容都是我干的迄薄。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼煮岁,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼讥蔽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起画机,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤冶伞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后步氏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响禽,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年荚醒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芋类。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腌且,死狀恐怖梗肝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铺董,我是刑警寧澤巫击,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站精续,受9級(jí)特大地震影響坝锰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜重付,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一顷级、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧确垫,春花似錦弓颈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至披泪,卻和暖如春纤子,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工控硼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泽论,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓卡乾,卻偏偏與公主長得像翼悴,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子说订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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