這篇文章主要為大家介紹了關於java8學習教程之函數引用的使用,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習下。
前言
我們在上一篇文章中以實例講解如何定義和使用lambda 表達式,以及與其它語言相比, lambda 表達式在Java 中的特殊規格。並且提到,lambda 表達式可以進一步簡化為函數引用。
這篇文章將介紹如何使用函數引用,話不多說了,來一起看看詳細的介紹。
函數所引用的型別
函數參考分為以下四個:
靜態函數,例如Integer 類別的parseInt 函數,可以寫作Integer::parseInt
物件層級函數的引用,例如String 類別的length 函數,可以寫作String::length
具體實例的函數的引用,例如名稱為expensiveTransaction 的一個實例的getValue,寫作expensiveTransaction::getValue
建構子的參考
#靜態函數
例如:
Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);
可以寫作:
Function<String, Integer> stringToInteger = Integer::parseInt;
##可以寫物件層級函數的參考
BiPredicate<List<String>, String> contains = (list, element) -> list.contains(element);可以寫:
#
BiPredicate<List<String>, String> contains = List::contains;
建構子的引用
下面再舉一個建構子的例子, 先定義一個函數式接口,唯一的方法get 會傳回指定型別的物件。@FunctionalInterface public interface Supplier<T> { T get(); }
Supplier<TantanitReader> constructor = () -> new TantanitReader(); TantanitReader tantanitReader = constructor.get();上述程式碼的 lambda 表達式 new 並傳回一個新的對象,使得 constructor 變數成為一個建構器的參考。 等價於以下函數引用:
Supplier<TantanitReader> constructor2 = TantanitReader::new; TantanitReader tantanitReader2 = constructor2.get();以上的例子都是沒有參數的情況,以下仍以建構子為例,介紹有參數的情況:
public TantanitReader(String loginName) { this.loginName = loginName; }
Function<String,TantanitReader> constructor3 = (loginName) -> new TantanitReader(loginName); TantanitReader tantanitReader3 = constructor3.apply("jack"); Function<String,TantanitReader> constructor4 = TantanitReader::new; TantanitReader tantanitReader4 = constructor4.apply("jack"); TantanitReader tantanitReader5 = constructor4.apply("tom");這時由於函數只有一個參數,可以使用Java 自帶的Function這個函數式接口,它實際起作用的函數如下:
R apply(T t);作用為根據一個參數,傳回一個結果。我們由此可以使用 constructor4 以及對應的函數來引用 constructor5。
小結
使用函數引用不僅可以簡化lambda 表達式,而且在語意上可以更專注於方法名稱,也就是要做的事,抽象層次更加接近人類的認知。所以,應盡可能使用函數引用。總結#
以上是Java8中關於函數引用的使用方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!