Java程序员必须知道的Java10特性
在上一篇我們對(duì)Java 9的特性進(jìn)行了一些回顧,今天接著來(lái)看看Java 10帶來(lái)了什么特性。之所以需要把Java 8 到Java 17的特性歸納一遍,因?yàn)镴ava社區(qū)對(duì)Java 17的重視程度前所未有。話不多說(shuō),讓我們走進(jìn)Java 10。
Java 10
從Java 10 開(kāi)始,Java的迭代周期縮短為半年,半年發(fā)布一個(gè)版本。
局部變量類(lèi)型推斷
在Java 6時(shí)初始化一個(gè)Map需要我們這樣來(lái)聲明:
?Map<String, String> map = new HashMap<String,String>();事實(shí)上泛型方法的參數(shù)可以通過(guò)上下文推導(dǎo)出來(lái),所以在Java 7 中簡(jiǎn)化為:
?Map<String, String> map = new HashMap<>();到了Java 10 進(jìn)一步升華了類(lèi)型推斷,我們看一個(gè)例子:
? ? ? ? ?var map = Map.of("hello","world");String var = map.get("hello");猛一看還以為是Javascript的寫(xiě)法,事實(shí)上這就是Java。編譯器從右側(cè)的初始化程序的類(lèi)型推斷出初始化類(lèi)型,這將大量減少一些樣板代碼。不過(guò)請(qǐng)注意,此特性僅適用于初始化局部變量,它不能用于成員變量、方法參數(shù)、返回類(lèi)型等場(chǎng)景中。
另一件要注意的事情是var 并不是Java中的關(guān)鍵字,這確保了Java的向后兼容性。另外使用var沒(méi)有運(yùn)行時(shí)開(kāi)銷(xiāo),也不會(huì)使 Java 成為動(dòng)態(tài)語(yǔ)言。var標(biāo)記的變量的類(lèi)型仍然是在編譯時(shí)推斷出來(lái)。
var 不應(yīng)該被濫用
雖然這樣“爽起來(lái)了”,但是var也不應(yīng)該被濫用。
下面這種寫(xiě)法明細(xì)可讀性差,導(dǎo)致變量的類(lèi)型需要你去DEBUG:
?var data = someObject.getData();流中也盡量不要使用:
?// 可讀性差var names= apples.stream().map(Apple::getName).collect(Collectors.toList());因此,在使用var時(shí)應(yīng)該保證必要的可讀性。
另外,在多態(tài)這個(gè)重要的Java特性中,var表現(xiàn)的并不是很完美。如果Fruit有Apple和Orange兩種實(shí)現(xiàn)。
?var x = new Apple();如果我們對(duì)x重新賦值為new Orange()就會(huì)報(bào)錯(cuò),因?yàn)榫幾g后x的類(lèi)型就已經(jīng)固定下來(lái)了。所以var和泛型一樣都是在編譯過(guò)程中起了作用。你必須保證var的類(lèi)型是確定的。
那么話又說(shuō)回來(lái)了,var結(jié)合泛型的鉆石符號(hào)<>會(huì)有什么情況發(fā)生呢?
下面的 empList的類(lèi)型是ArrayList<Object>:
?var empList = new ArrayList<>();如果我們需要明確集合中放的都是Apple就必須在右邊顯式聲明:
?var apples = new ArrayList<Apple>();不可變集合
其實(shí)在Java 9中不可變集合已經(jīng)得到了一些加強(qiáng),在Java 10中進(jìn)一步加強(qiáng)了不可變集合。為什么不可變集合變得如此重要?
- 不可變性(immutability),這是函數(shù)式編程的基石之一,因此加強(qiáng)不可變集合有助于函數(shù)式編程在Java中的發(fā)展。
- 安全性,由于集合不可變,因此就不存在競(jìng)態(tài)條件,天然的線程安全性,無(wú)論在編碼過(guò)程中和內(nèi)存使用中都有一定的優(yōu)勢(shì),這種特性在Scala和Kotlin這兩種編程語(yǔ)言中大放異彩。
在Java 10 中又引入了一些新的API。
集合副本
復(fù)制一個(gè)集合為不可變集合:
? List<Apple> copyList = List.copyOf(apples);任何修改此類(lèi)集合的嘗試都會(huì)導(dǎo)致java.lang.UnsupportedOperationException異常。
Stream歸納為不可變集合
之前Stream API的歸納操作collect(Collector collector)都只會(huì)把流歸納為可變集合,現(xiàn)在它們都有對(duì)應(yīng)的不可變集合了。舉個(gè)例子:
?List<String> names= apples.stream().map(Apple::getName).collect(Collectors.toUnmodifiableList());Optional.orElseThrow()
? ? ? ? ?Optional<String> optional = Optional.ofNullable(nullableVal);// 可能會(huì) NoSuchElementExceptionString ?nullable = optional.get();Optional如果值為null時(shí)去get會(huì)拋出NoSuchElementException異常。從語(yǔ)義上get應(yīng)該肯定能得到什么東西,但是實(shí)際上異常了,這種歧義性太大了。所以增加了一個(gè)orElseThrow()方法來(lái)增強(qiáng)語(yǔ)義性。
其它增強(qiáng)特性
Java 10的性能也明顯加強(qiáng)了,支持G1并行垃圾收集。另外引入了即時(shí)編譯技術(shù)(JIT),該技術(shù)可以加速java程序的運(yùn)行速度。 另外Java 10對(duì)容器集成也進(jìn)行了優(yōu)化,JVM會(huì)根據(jù)容器的配置進(jìn)行選擇CPU核心數(shù)量和內(nèi)存占用。還有其它一些底層優(yōu)化特性這里就不多說(shuō)了,了解為主,當(dāng)你達(dá)到一定的層次會(huì)自己去了解的。到此Java 10的一些變化就歸納完了,其實(shí)并不是很多,都很好掌握。多多關(guān)注,不要走開(kāi),下次我們將對(duì)Java 11的一些變化和改進(jìn)進(jìn)行歸納。
總結(jié)
以上是生活随笔為你收集整理的Java程序员必须知道的Java10特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 产品说,我只需要一个有亿点复杂的查询界面
- 下一篇: 功能、资源权限管理的设计