java8學(xué)習(xí)教程之函數(shù)引用的使用方法
前言
我們?cè)?a target="_blank" href="http://m.fzitv.net/article/123911.htm">上一篇文章 中以實(shí)例講解如何定義和使用 lambda 表達(dá)式,以及與其它語(yǔ)言相比,lambda 表達(dá)式在 Java 中的特殊規(guī)范。并且提到,lambda 表達(dá)式可以進(jìn)一步簡(jiǎn)化為函數(shù)引用。
這篇文章將介紹如何使用函數(shù)引用,話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
函數(shù)引用的類型
函數(shù)引用分為以下四種:
- 靜態(tài)函數(shù),比如 Integer 類的 parseInt 函數(shù),可以寫作
Integer::parseInt - 對(duì)象級(jí)別函數(shù)的引用,比如 String 類的 length 函數(shù),可以寫作
String::length - 具體實(shí)例的函數(shù)的引用,比如名稱為 expensiveTransaction 的一個(gè)實(shí)例的 getValue,寫作
expensiveTransaction::getValue - 構(gòu)造函數(shù)的引用
靜態(tài)函數(shù)
比如:
Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);
可以寫作:
Function<String, Integer> stringToInteger = Integer::parseInt;
對(duì)象級(jí)別函數(shù)的引用
BiPredicate<List<String>, String> contains = (list, element) -> list.contains(element);
可以寫作:
BiPredicate<List<String>, String> contains = List::contains;
構(gòu)造函數(shù)的引用
下面再舉一個(gè)構(gòu)造函數(shù)的例子, 首先定義一個(gè)函數(shù)式接口,唯一的方法 get 返回指定類型的對(duì)象。
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Supplier<TantanitReader> constructor = () -> new TantanitReader(); TantanitReader tantanitReader = constructor.get();
上述代碼的 lambda 表達(dá)式 new 并返回一個(gè)新的對(duì)象,使得 constructor 變量成為一個(gè)構(gòu)造器的引用。
等價(jià)于以下函數(shù)引用:
Supplier<TantanitReader> constructor2 = TantanitReader::new; TantanitReader tantanitReader2 = constructor2.get();
以上的例子都是沒(méi)有參數(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ù)只有一個(gè)參數(shù),可以使用 Java 自帶的 Function這個(gè)函數(shù)式接口,它實(shí)際起作用的函數(shù)如下:
R apply(T t);
作用為根據(jù)一個(gè)參數(shù),返回一個(gè)結(jié)果。我們由此可以使用 constructor4 以及相應(yīng)的函數(shù)引用 constructor5。
小結(jié)
使用函數(shù)引用不僅可以簡(jiǎn)化 lambda 表達(dá)式,而且在語(yǔ)義上可以更加專注于方法名稱,也就是要做的事,抽象級(jí)別更加接近人類的認(rèn)知。所以,應(yīng)當(dāng)盡可能使用函數(shù)引用。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SpringBoot?ApplicationContext接口深入分析
ApplicationContext是Spring應(yīng)用程序中的中央接口,由于繼承了多個(gè)組件,使得ApplicationContext擁有了許多Spring的核心功能,如獲取bean組件,注冊(cè)監(jiān)聽(tīng)事件,加載資源文件等2022-11-11
JavaWeb核心技術(shù)中Session與Cookie淺析
session的工作原理和cookie非常類似,在cookie中存放一個(gè)sessionID,真實(shí)的數(shù)據(jù)存放在服務(wù)器端,客戶端每次發(fā)送請(qǐng)求的時(shí)候帶上sessionID,服務(wù)端根據(jù)sessionID進(jìn)行數(shù)據(jù)的響應(yīng)2023-02-02
springboot集成mqtt的實(shí)踐開(kāi)發(fā)
本篇文章主要介紹了springboot集成mqtt的實(shí)踐開(kāi)發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
Spring cloud alibaba之Ribbon負(fù)載均衡實(shí)現(xiàn)方案
Spring cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的一套客戶端的負(fù)載均衡工具,Ribbon客戶端提供一系列完善的配置,如超時(shí)、重試等,Ribbon也可以實(shí)現(xiàn)自己的負(fù)載均衡算法,感興趣的朋友跟隨小編一起看看吧2021-07-07
SpringBoot使用spring retry重試機(jī)制的操作詳解
實(shí)際工作中由于網(wǎng)絡(luò)波動(dòng)等原因?qū)е麓a執(zhí)行失敗需要重新執(zhí)行,保證最終能夠完成業(yè)務(wù)功能,通常來(lái)說(shuō),會(huì)用try/catch,while循環(huán)或者定時(shí)任務(wù)重處理,但是這樣的做法缺乏統(tǒng)一性,要多寫很多代碼,spring-retry組件可以通過(guò)注解優(yōu)雅的實(shí)現(xiàn)重處理功能2024-12-12
JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式
今天小編就為大家分享一篇關(guān)于JAVA使用Elasticsearch查詢in和not in的實(shí)現(xiàn)方式,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Java后端Tomcat實(shí)現(xiàn)WebSocket實(shí)例教程
WebSocket protocol 是HTML5一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。一開(kāi)始的握手需要借助HTTP請(qǐng)求完成握手。本文給大家介紹Java后端Tomcat實(shí)現(xiàn)WebSocket實(shí)例教程,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
Apache POI將PPT轉(zhuǎn)換成圖片實(shí)例代碼
這篇文章主要介紹了Apache POI將PPT轉(zhuǎn)換成圖片實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

