1. 程式人生 > 其它 >Java_新特性(Java8---->Java11)

Java_新特性(Java8---->Java11)

第二十二章 新特性

22.1 Java8的新特性

22.1.1 Java8的概述

  • Java8是 Java 語言的一個重要版本,該版本於2014年3月釋出,是自Java5以來最具革命性的版本,這個版本包含語言、編譯器、庫、工具和JVM等方面的十多個新特性。

22.1.2 函式式介面

  • 函式式介面主要指只包含一個抽象方法的介面,如:java.lang.Runnable、java.util.Comparator介面等。
  • Java8提供@FunctionalInterface註解來定義函式式介面,若定義的介面不符合函式式的規範便會報錯。
  • Java8中增加了java.util.function包,該包包含了常用的函式式介面,具體如下:

22.1.3 Lambda表示式

  • Lambda 表示式是例項化函式式介面的重要方式,使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊。
  • lambda表示式:引數列表、箭頭符號->和方法體組成,而方法體中可以是表示式,也可以是語句塊。
  • 語法格式:(引數列表) -> { 方法體; } - 其中()、引數型別、{} 以及return關鍵字 可以省略。

22.1.4 方法引用

  • 方法引用主要指通過方法的名字來指向一個方法而不需要為方法引用提供方法體,該方法的呼叫交給函式式介面執行。
  • 方法引用使用一對冒號 :: 將類或物件與方法名進行連線,通常使用方式如下:
    • 物件的非靜態方法引用 ObjectName :: MethodName
    • 類的靜態方法引用 ClassName :: StaticMethodName
    • 類的非靜態方法引用 ClassName :: MethodName
    • 構造器的引用 ClassName :: new
    • 陣列的引用 TypeName[] :: new
  • 方法引用是在特定場景下lambda表示式的一種簡化表示,可以進一步簡化程式碼的編寫使程式碼更加緊湊簡潔,從而減少冗餘程式碼。

22.1.5 Stream介面

  • 案例題目:
    • 準備一個List集合並放入Person型別的物件,將集合中所有成年人過濾出來放到另外一個集合並打印出來。

(1)基本概念

  • java.util.stream.Stream介面是對集合功能的增強,可以對集合元素進行復雜的查詢、過濾、篩選等操作。
  • Stream介面藉助於Lambda 表示式極大的提高程式設計效率和程式可讀性,同時它提供序列和並行兩種模式進行匯聚操作,併發模式能夠充分利用多核處理器的優勢。

(2)使用步驟

  • 建立Stream,通過一個數據源來獲取一個流。
  • 轉換Stream,每次轉換返回一個新的Stream物件。
  • 對Stream進行聚合操作併產生結果。

(3)建立方式

  • 方式一:通過呼叫集合的預設方法來獲取流,如:default Stream stream()
  • 方式二:通過陣列工具類中的靜態方法來獲取流,如:static IntStream stream(int[] array)
  • 方式三:通過Stream介面的靜態方法來獲取流,如:static Stream of(T... values)
  • 方式四:通過Stream介面的靜態方法來獲取流,static Stream generate(Supplier<? extends T>s)

(4)中間操作

  • 篩選與切片的常用方法如下:
  • 對映的常用方法如下:
  • 排序的常用方法如下:

(5)終止操作

  • 匹配與查詢的常用方法如下:
  • 規約的常用方法如下:
  • 收集的常用方法如下:

22.1.6 Optional類

  • 案例題目
    • 判斷字串是否為空,若不為空則列印字串的長度,否則列印0。

(1)基本概念

  • java.util.Optional類可以理解為一個簡單的容器,其值可能是null或者不是null,代表一個值存在或不存在。
  • 該類的引入很好的解決空指標異常,不用顯式進行空值檢測。

(2)常用的方法

22.2 Java9的新特性

22.2.1 Java9的概述

  • Java9釋出於2017年9月釋出,帶來了很多新特性,其中最主要的變化是模組化系統。
  • 模組就是程式碼和資料的封裝體,模組的程式碼被組織成多個包,每個包中包含Java類和介面,模組的資料則包括資原始檔和其他靜態資訊。

22.2.2 模組化的使用

(1)語法格式

  • 在 module-info.java 檔案中,我們可以用新的關鍵詞module來宣告一個模組,具體如下:
    • module 模組名稱 {
    • }

(2)模組化的優勢

  • 減少記憶體的開銷。
  • 可簡化各種類庫和大型應用的 開發和維護。
  • 安全性,可維護性,提高效能。

22.2.3 鑽石操作符的使用升級

  • 在Java9中允許在匿名內部類的使用中使用鑽石操作符。

22.2.4 集合工廠方法

(1)基本概念

  • Java9的List、Set和Map集合中增加了靜態工廠方法of實現不可變例項的建立。
  • 不可變體現在無法新增、修改和刪除它們的元素。
  • 不允許新增null元素物件。

(2)實際意義

  • 保證執行緒安全:在併發程式中既保證執行緒安全性,也大大增強了併發時的效率。
  • 被不可信的類庫使用時會很安全。
  • 如果一個物件不需要支援修改操作,將會節省空間和時間的開銷。
  • 可以當作一個常量來對待,並且這個物件在以後也不會被改變。

22.2.5 InputStream的增強

  • InputStream類中提供了transferTo方法實現將資料直接傳輸到OutputStream中。

22.3 Java10的新特性

22.3.1 Java10的概述

  • Java10於2018年3月釋出,改進的關鍵點包括一個本地型別推斷、一個垃圾回收的增強。
  • Java10計劃只是一個短期版本,因此公開更新將在六個月內結束,9月份釋出的Java11將是Java的長期支援(LTS)版本,LTS版本的釋出每三年釋出一次。

22.3.2 區域性變數型別推斷

(1)基本概念

  • Java10可以使用var作為區域性變數型別推斷識別符號,此符號僅適用於區域性變數,增強for迴圈的索引,以及傳統for迴圈的本地變數。
  • 它不能使用於方法形式引數,建構函式形式引數,方法返回型別,欄位,catch形式引數或任何其他型別的變數宣告。

(2)實際意義

  • 識別符號var不是關鍵字,只是一個保留的型別名稱。這意味著var用作變數,方法名或包名的程式碼不會受到影響,但var不能作為類或則介面的名字。
  • 避免了資訊冗餘。
  • 對齊了變數名。
  • 更容易閱讀。

22.4 Java11的新特性

22.4.1 Java11的概述

  • Java11於2018年9月正式釋出,這是 Java 大版本週期變化 後的第一個長期支援版本,非常值得關注。

22.4.2 簡化的編譯執行操作

  • 在Java11中可以使用java命令一次性進行編譯和執行操作。
  • 執行原始檔中的第一個類必須包含主方法。
  • 不可以使用其它原始檔中自定義的類。

22.4.3 String類新增方法