<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 9 - 17 特性解讀:Java 10

          共 3226字,需瀏覽 7分鐘

           ·

          2021-10-08 19:55

          在上一篇我們對Java 9的特性進行了一些回顧,今天接著來看看Java 10帶來了什么特性。之所以需要把Java 8 到Java 17的特性歸納一遍,因為Java社區(qū)對Java 17的重視程度前所未有。話不多說,讓我們走進Java 10。

          Java 10

          從Java 10 開始,Java的迭代周期縮短為半年,半年發(fā)布一個版本。

          局部變量類型推斷

          在Java 6時初始化一個Map需要我們這樣來聲明:

          Map<String, String> map = new HashMap<String,String>();

          事實上泛型方法的參數(shù)可以通過上下文推導(dǎo)出來,所以在Java 7 中簡化為:

          Map<String, String> map = new HashMap<>();

          到了Java 10 進一步升華了類型推斷,我們看一個例子:

                  var map = Map.of("hello","world");
                  String var = map.get("hello");

          猛一看還以為是Javascript的寫法,事實上這就是Java。編譯器從右側(cè)的初始化程序的類型推斷出初始化類型,這將大量減少一些樣板代碼。不過請注意,此特性僅適用于初始化局部變量,它不能用于成員變量、方法參數(shù)、返回類型等場景中。

          ?

          另一件要注意的事情是var 并不是Java中的關(guān)鍵字,這確保了Java的向后兼容性。另外使用var沒有運行時開銷,也不會使 Java 成為動態(tài)語言。var標記的變量的類型仍然是在編譯時推斷出來。

          var 不應(yīng)該被濫用

          雖然這樣“爽起來了”,但是var也不應(yīng)該被濫用。

          下面這種寫法明細可讀性差,導(dǎo)致變量的類型需要你去DEBUG:

          var data = someObject.getData();

          Stream流中也盡量不要使用:

          // 可讀性差
          var names= apples.stream()
              .map(Apple::getName)
              .collect(Collectors.toList());

          因此,在使用var時應(yīng)該保證必要的可讀性。

          另外,在多態(tài)這個重要的Java特性中,var表現(xiàn)的并不是很完美。如果FruitAppleOrange兩種實現(xiàn)。

          var x = new Apple();

          如果我們對x重新賦值為new Orange()就會報錯,因為編譯后x的類型就已經(jīng)固定下來了。所以var和泛型一樣都是在編譯過程中起了作用。你必須保證var的類型是確定的。

          ?

          那么話又說回來了,var結(jié)合泛型的鉆石符號<>會有什么情況發(fā)生呢?

          下面的 empList的類型是ArrayList<Object>

          var empList = new ArrayList<>();

          如果我們需要明確集合中放的都是Apple就必須在右邊顯式聲明:

          var apples = new ArrayList<Apple>();

          不可變集合

          其實在Java 9中不可變集合已經(jīng)得到了一些加強,在Java 10中進一步加強了不可變集合。為什么不可變集合變得如此重要?

          • 不可變性(immutability),這是函數(shù)式編程的基石之一,因此加強不可變集合有助于函數(shù)式編程在Java中的發(fā)展。
          • 安全性,由于集合不可變,因此就不存在競態(tài)條件,天然的線程安全性,無論在編碼過程中和內(nèi)存使用中都有一定的優(yōu)勢,這種特性在Scala和Kotlin這兩種編程語言中大放異彩。

          在Java 10 中又引入了一些新的API。

          集合副本

          復(fù)制一個集合為不可變集合:

           List<Apple> copyList = List.copyOf(apples);

          任何修改此類集合的嘗試都會導(dǎo)致java.lang.UnsupportedOperationException異常。

          Stream歸納為不可變集合

          之前Stream API的歸納操作collect(Collector collector)都只會把流歸納為可變集合,現(xiàn)在它們都有對應(yīng)的不可變集合了。舉個例子:

          List<String> names= apples.stream()    .map(Apple::getName)    .collect(Collectors.toUnmodifiableList());

          Optional.orElseThrow()

                  Optional<String> optional = Optional.ofNullable(nullableVal);        // 可能會 NoSuchElementException        String  nullable = optional.get();

          Optional如果值為null時去get會拋出NoSuchElementException異常。從語義上get應(yīng)該肯定能得到什么東西,但是實際上異常了,這種歧義性太大了。所以增加了一個orElseThrow()方法來增強語義性。

          其它增強特性

          Java 10的性能也明顯加強了,支持G1并行垃圾收集。另外引入了即時編譯技術(shù)(JIT),該技術(shù)可以加速java程序的運行速度。另外Java 10對容器集成也進行了優(yōu)化,JVM會根據(jù)容器的配置進行選擇CPU核心數(shù)量和內(nèi)存占用。還有其它一些底層優(yōu)化特性這里就不多說了,了解為主,當你達到一定的層次會自己去了解的。到此Java 10的一些變化就歸納完了,其實并不是很多,都很好掌握。多多關(guān)注,不要走開,下次我們將對Java 11的一些變化和改進進行歸納。


          往期推薦

          因“薪水太高”被欠薪3個月、后又遭解雇?程序員憤怒反擊!

          別再用 BeanUtils 了,這款 PO VO DTO 轉(zhuǎn)換神器不香么?

          收下這個“短信驗證”的最佳實踐項目!

          數(shù)據(jù)庫界的Swagger:一鍵生成數(shù)據(jù)庫文檔!你不了解一下?

          國產(chǎn)Linux發(fā)行版再添一員,操作界面不輸蘋果!


          技術(shù)交流群

          最近有很多人問,有沒有讀者交流群,想知道怎么加入。加入方式很簡單,有興趣的同學(xué),只需要點擊下方卡片,回復(fù)“加群,即可免費加入我們的高質(zhì)量技術(shù)交流群!

          點擊閱讀原文,送你免費Spring Boot教程!

          瀏覽 22
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩黄色成人网站 | 大香蕉在线观看免费全集高清 | 国产乱子伦精品视频潮 | A片一区二区 | 欧美成人午夜精品 |