java8學(xué)習(xí)教程之函數(shù)引用的使用方法
前言
我們在上一篇文章 中以實例講解如何定義和使用 lambda 表達(dá)式,以及與其它語言相比,lambda 表達(dá)式在 Java 中的特殊規(guī)范。并且提到,lambda 表達(dá)式可以進一步簡化為函數(shù)引用。
這篇文章將介紹如何使用函數(shù)引用,話不多說了,來一起看看詳細(xì)的介紹吧。
函數(shù)引用的類型
函數(shù)引用分為以下四種:
- 靜態(tài)函數(shù),比如 Integer 類的 parseInt 函數(shù),可以寫作
Integer::parseInt
- 對象級別函數(shù)的引用,比如 String 類的 length 函數(shù),可以寫作
String::length
- 具體實例的函數(shù)的引用,比如名稱為 expensiveTransaction 的一個實例的 getValue,寫作
expensiveTransaction::getValue
- 構(gòu)造函數(shù)的引用
靜態(tài)函數(shù)
比如:
Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);
可以寫作:
Function<String, Integer> stringToInteger = Integer::parseInt;
對象級別函數(shù)的引用
BiPredicate<List<String>, String> contains = (list, element) -> list.contains(element);
可以寫作:
BiPredicate<List<String>, String> contains = List::contains;
構(gòu)造函數(shù)的引用
下面再舉一個構(gòu)造函數(shù)的例子, 首先定義一個函數(shù)式接口,唯一的方法 get 返回指定類型的對象。
@FunctionalInterface public interface Supplier<T> { T get(); }
Supplier<TantanitReader> constructor = () -> new TantanitReader(); TantanitReader tantanitReader = constructor.get();
上述代碼的 lambda 表達(dá)式 new 并返回一個新的對象,使得 constructor 變量成為一個構(gòu)造器的引用。
等價于以下函數(shù)引用:
Supplier<TantanitReader> constructor2 = TantanitReader::new; TantanitReader tantanitReader2 = constructor2.get();
以上的例子都是沒有參數(shù)的情況,下面仍然以構(gòu)造函數(shù)為例,介紹有參數(shù)的情況:
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");
這時由于函數(shù)只有一個參數(shù),可以使用 Java 自帶的 Function這個函數(shù)式接口,它實際起作用的函數(shù)如下:
R apply(T t);
作用為根據(jù)一個參數(shù),返回一個結(jié)果。我們由此可以使用 constructor4 以及相應(yīng)的函數(shù)引用 constructor5。
小結(jié)
使用函數(shù)引用不僅可以簡化 lambda 表達(dá)式,而且在語義上可以更加專注于方法名稱,也就是要做的事,抽象級別更加接近人類的認(rèn)知。所以,應(yīng)當(dāng)盡可能使用函數(shù)引用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Spring Eureka 未授權(quán)訪問漏洞修復(fù)問題小結(jié)
項目組使用的 Spring Boot 比較老,是 1.5.4.RELEASE ,最近被檢測出 Spring Eureka 未授權(quán)訪問漏洞,這篇文章主要介紹了Spring Eureka 未授權(quán)訪問漏洞修復(fù)問題小結(jié),需要的朋友可以參考下2024-04-04JDK1.6“新“特性Instrumentation之JavaAgent(推薦)
這篇文章主要介紹了JDK1.6“新“特性Instrumentation之JavaAgent,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08MybatisPlus結(jié)合groupby實現(xiàn)分組和sum求和的步驟
這篇文章主要介紹了MybatisPlus結(jié)合groupby實現(xiàn)分組和sum求和的步驟,這次使用的是LambdaQueryWrapper,使用QueryWrapper相對來說簡單點就不寫了,本文分步驟給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-12-12SpringBoot默認(rèn)包掃描機制及@ComponentScan指定掃描路徑詳解
這篇文章主要介紹了SpringBoot默認(rèn)包掃描機制及@ComponentScan指定掃描路徑詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11