Java8新特性你瞭解多少呢?

前言

記得面試時常會有這樣的問答

面試官:“Java8新特性瞭解嗎?能說一下嗎?”

我:“嗯……瞭解一點”

然後巴拉巴拉說了一些。

Java8

新特性,很多人應該都瞭解過,

Java8

新特性是Java一次重大的版本升級後新增的,有人認為,雖然這些新特性可以令Java開發人員提高開發效率,但同時也需要花不少精力去學習,接下來我們就來介紹下

Java8

新特性。

一、介面預設方法

Java 8

允許我們給介面新增一個非抽象的方法實現,這裡只需要使用 default關鍵字即可,故這個特徵又叫做擴充套件方法,示例如下:

interface Formula { double calculate(int a); default double sqrt(int a) { return Math。sqrt(a); }}複製程式碼

解釋:Formula介面在擁有calculate方法之外同時還定義了sqrt方法,實現了Formula介面的子類只需要實現一個calculate方法,預設方法sqrt將在子類上可以直接使用。

Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; formula。calculate(100); // 100。0 formula。sqrt(16); // 4。0複製程式碼

解釋:以上程式碼中的formula被實現為一個匿名類的例項,該程式碼非常容易理解,6行程式碼實現了計算sqrt(a * 100)。在接下來,我們將會看到實現單方法介面的更簡單的做法。

二、Lambda 表示式

首先來看下原先Java中是如何排列字串的

List names = Arrays。asList(“peterF”, “anna”, “mike”, “xenia”);Collections。sort(names,newComparator() { @Override public int compare (String a, String b){ return b。compareTo(a); }});複製程式碼

以上程式碼只需要給靜態方法 Collections。sort 傳入一個List物件以及一個比較器來按指定順序排列。其中通常做法都是建立一個匿名的比較器物件然後將其傳遞給sort方法。

但是在

Java8

中你就沒必要使用這種傳統的匿名物件的方式了,

Java 8

提供了更簡潔的語法,lambda表示式:

Collections。sort(names, (String a, String b) -> { return b。compareTo(a); });複製程式碼

優點是程式碼變得更短且更具有可讀性,但是實際上還可以寫得更短,如下:

Collections。sort(names, (String a, String b) -> b。compareTo(a));複製程式碼

但是對於函式體只有一行程式碼的,你可以去掉大括號{}以及return關鍵字,你還可以寫得更短點,如下:

Collections。sort(names, (a, b) -> b。compareTo(a));複製程式碼

Java編譯器功能很強大,接下來我們看看lambda表示式還能作出什麼更方便的東西來。

三、函式式介面

Lambda表示式是如何在Java的型別系統中表示的呢?每一個lambda表示式都對應一個型別,通常是接 口型別。而“函式式介面”是指僅僅只包含一個抽象方法的介面,每一個該型別的lambda表示式都會被匹 配到這個抽象方法。因為預設方法不算抽象方法,所以你也可以給你的函式式介面新增預設方法。我們可以將lambda表示式當作任意只包含一個抽象方法的介面型別,確保你的介面一定達到這個要求,你只需要給你的介面新增 @FunctionalInterface 註解,編譯器如果發現你標註了這個註解的介面有多於一個抽象方法的時候會報錯的。示例如下:

@FunctionalInterfaceinterface Converter { T convert(F from);}Converter converter = (from) -> Integer。valueOf(from);Integer converted = converter。convert(“123”);System。out。println(converted); // 123複製程式碼

需要注意@FunctionalInterface如果沒有指定,上面的程式碼也是對的。

四、方法與建構函式引用

前一節中的程式碼還可以透過靜態方法引用來表示,如下:

Converter converter = Integer::valueOf;Integer converted = converter。convert(“123”); System。out。println(converted); // 123複製程式碼

在Java 8中允許你使用 :: 關鍵字來傳遞方法或者建構函式引用,上面的程式碼展示瞭如何引用一個靜態方法,我們也可以引用一個物件的方法,如下:

converter =something::startsWith;String converted = converter。convert(“Java”);System。out。println(converted);複製程式碼

接下來再看看建構函式是如何使用::關鍵字來引用的。首先我們定義一個包含多個建構函式的簡單Person類:

class Person { String firstName; String lastName; Person() { } Person(String firstName, String lastName) { this。firstName = firstName; this。lastName = lastName; }}複製程式碼

接下來我們指定一個用來建立Person物件的物件工廠介面,程式碼如下:

interface PersonFactory { P create(String firstName, String lastName);}複製程式碼

在這裡我們使用建構函式是來引用將他們關聯起來,而不是實現一個完整的工廠,程式碼如下:

PersonFactory personFactory = Person::new;Person person = personFactory。create(“Peter”, “Parker”);複製程式碼

結論是我們只需要使用 Person::new 來獲取Person類建構函式的引用,Java編譯器會自動根據PersonFactory。create方法的簽名來選擇合適的建構函式。

五、Stream流

Java8

之前的傳統程式設計方式,如果我們需要操作一個集合資料,那就要使用集合提供的API,透過一個迴圈去獲取集合的元素,這種訪問資料的方式會使程式碼顯得臃腫,

Java8

新引入的Stream類,用於重新封裝集合資料,透過使用流式Stream代替常用集合陣列、list和map的遍歷操作可以極大的提高效率 可以形象地理解Stream的操作是對一組粗糙的工藝品原型(即對應的 Stream 資料來源)進行加工成顏色統一的工藝品(即最終得到的結果),第一步篩選出合適的原型(即對應Stream的 filter 的方法),第二步將這些篩選出來的原型工藝品上色(對應Stream的map方法),第三步取下這些上好色的工藝品(即對應Stream的 collect(toList())方法)。在取下工藝品之前進行的操作都是中間操作,可以有多個或者0箇中間操作,但每個Stream資料來源只能有一次終止操作,否則程式會報錯。 示例: map中間操作中將一種型別的值對映為另一種型別的值,可以將 Stream 中的每個值都對映為一個新的值,最終轉換為一個新的 Stream 流。例:把 Stream 中每個字串都轉換為大寫的形式。

public void mapTest() { String[] testStrings = {“java”, “react”, “angular”, “vue”}; List list = Stream。of(testStrings)。map(test -> test。toUpperCase())。collect(Collectors。toList()); list。forEach(test -> System。out。println(test));}複製程式碼

結語

對於

Java8

新特性的介紹,網上的觀點有很多,但是其中最常用的幾個特性是Lambda表示式、方法引用和Stream流,這幾個在我們日常工作的見得多用得應該也是最多的,其他就暫時不介紹了。

Java8

新特性用得好,開發效率會提高。

作者:Bincool

連結:https://juejin。cn/post/7018046455604592677

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。