首頁(yè)技術(shù)文章正文

Java8方法引用

更新時(shí)間:2018-07-06 來(lái)源:黑馬程序員JavaEE培訓(xùn)學(xué)院 瀏覽量:

內(nèi)容簡(jiǎn)介:

方法引用Demo詳解

通過(guò)5種語(yǔ)法使用方法引用

方法引用使用總結(jié)


1. 在Java8中方法引用Demo詳解

1.1 方法引用出現(xiàn)的背景

在使用Lambda表達(dá)式的時(shí)候,我們實(shí)際上傳遞進(jìn)去的代碼就是一種解決方案:拿什么參數(shù)做什么操作。

那么考慮一種情況:如果我們?cè)贚ambda中所指定的操作方案,已經(jīng)有地方存在相同方案,那是否還有必要再寫重復(fù)邏輯呢?

1530863550290_111.png

1.2 問(wèn)題的引出

1530863557071_222.png

1.3 問(wèn)題的發(fā)現(xiàn)與解決

這段代碼的問(wèn)題在于,對(duì)String進(jìn)行控制臺(tái)打印輸出的操作方案,明明已經(jīng)有了現(xiàn)成的實(shí)現(xiàn),那就是System.out對(duì)象中的println(String)方法。既然Lambda希望做的事情就是調(diào)用println(String)方法,那何必自己手動(dòng)調(diào)用呢?

能否省去Lambda的語(yǔ)法格式(盡管它已經(jīng)相當(dāng)簡(jiǎn)潔)呢?只要“路由”過(guò)去就好了:

1530863566694_333.png

1.4 方法引用案例的總結(jié)

以上例中,System.out對(duì)象中有一個(gè)重載的println(String)方法恰好就是我們所需要的。那么對(duì)于printString方法的函數(shù)式接口參數(shù),對(duì)比下面兩種寫法:

Lambda表達(dá)式:s -> System.out.println(s);

方法引用:System.out::println

第一種語(yǔ)義是指:拿到參數(shù)之后經(jīng)Lambda之手,繼而傳遞給System.out.println方法去處理。第二種等效寫法的語(yǔ)義是指:直接讓System.out中的println方法來(lái)取代Lambda。兩種寫法的執(zhí)行效果完全一樣,而第二種方法引用的寫法復(fù)用了已有方案,更加簡(jiǎn)潔。1.5 引用運(yùn)算符

雙冒號(hào)“::”為引用運(yùn)算符,而它所在的表達(dá)式被稱為方法引用。如果Lambda要表達(dá)的函數(shù)方案已經(jīng)存在于某個(gè)方法的實(shí)現(xiàn)中,那么則可以通過(guò)雙冒號(hào)來(lái)引用該方法作為L(zhǎng)ambda的替代者。


2.通過(guò)5種語(yǔ)法使用方法引用

2.1 通過(guò)對(duì)象名引用成員方法

1530863609596_444.png

2.2 通過(guò)類名引用靜態(tài)方法

1530863603331_555.png

2.3 通過(guò)類名引用成員方法


2.4 通過(guò)super引用成員方法

1530863595629_666.png

2.5通過(guò)this引用成員方法

1530863590239_777.png

3.方法引用使用總結(jié)

        (1) Lambda表達(dá)式:s -> System.out.println(s);        (2) 方法引用:System.out::println


第一種語(yǔ)義是指:拿到參數(shù)之后經(jīng)Lambda之手,繼而傳遞給System.out.println方法去處理。


第二種等效寫法的語(yǔ)義是指:直接讓System.out中的println方法來(lái)取代Lambda。

兩種寫法的執(zhí)行效果完全一樣,而第二種方法引用的寫法復(fù)用了已有方案,更加簡(jiǎn)潔。

函數(shù)式接口是Lambda的基礎(chǔ),而方法引用是Lambda的孿生兄弟。

本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itheima.com/

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!