摘要:最后我們來看下創(chuàng)建函數(shù)式接口的最后一種,第三種方式構(gòu)造方法引用,繼續(xù)改程序構(gòu)造方法引用構(gòu)造方法引用的語法是類名我們給新添加了一個(gè)構(gòu)造方法,該構(gòu)造方法接收一個(gè)參數(shù),不返回值,編譯通過。
上一篇文章中,我們簡單介紹了Java8的Lambda表達(dá)式以及函數(shù)式接口的概念,接下來我們繼續(xù)深入Java8函數(shù)式編程模型。
public class Test1 { public static void main(String[] args) { Listlist = Arrays.asList(1,2,3,4,5,6,7,8,9,10); list.forEach(new Consumer () { @Override public void accept(Integer integer) { System.out.println(integer); } }); } }
這段程序很簡單,首先初始化一個(gè)Integer類型的集合然后向控制臺(tái)輸出每個(gè)元素。其中我們注意到forEach方法,它就是Java8中新增加的默認(rèn)方法。
public interface Iterable{ . .省略 . default void forEach(Consumer super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } }
它被聲明在Iterable接口中,并被關(guān)鍵字default修飾。這樣任何一個(gè)該接口的子類型都可以繼承forEach方法的實(shí)現(xiàn),所以List接口因?yàn)槭荌terable的間接子接口,所以也繼承了該默認(rèn)方法。Java8采用這種巧妙的方式既擴(kuò)展了接口的功能,又兼容了老版本。
接下來分析下forEach的實(shí)現(xiàn),首先接收了一個(gè)Consumer類型的參數(shù)action,進(jìn)行非空判斷,然后遍歷當(dāng)前所有元素交由action的accept方法進(jìn)行處理。那么Consumer又是什么鬼,看源碼
@FunctionalInterface public interface Consumer{ /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t); . .省略 . }
一個(gè)接口,有且僅有一個(gè)抽象方法,被@FunctionalInterface修飾,典型的函數(shù)式接口。
ok,現(xiàn)在我們知道forEach接收的Consumer類型的參數(shù)是一個(gè)函數(shù)式接口,接口里唯一的accept抽象方法接收一個(gè)參數(shù),不返回值。那通過上一篇文章我們知道,創(chuàng)建函數(shù)式接口類型的實(shí)例其中一種方式是使用Lambda表達(dá)式,所以可以將最上面的程序改造一下
public class Test1 { public static void main(String[] args) { Listlist = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //Lambda表達(dá)式 接收一個(gè)參數(shù) 不返回值 list.forEach(item -> System.out.println(item)); } }
該lambda表達(dá)式item -> System.out.println(item)接收一個(gè)參數(shù) 不返回值,符合accept方法定義,編譯通過。
也就是說如果使用lambda表達(dá)式來創(chuàng)建一個(gè)函數(shù)式接口實(shí)例,那這個(gè)lambda表達(dá)式的入?yún)⒑头祷乇仨毞线@個(gè)函數(shù)式接口中唯一的抽象方法的定義。
接下來再對(duì)程序進(jìn)行改造
public class Test1 { public static void main(String[] args) { Listlist = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //方法引用 list.forEach(System.out::println); } }
看到out后面有兩個(gè)冒號(hào),反正當(dāng)時(shí)我是凌亂了。。。這個(gè)就是函數(shù)式接口實(shí)例第二種創(chuàng)建方式:方法引用
方法引用的語法是 對(duì)象::方法名(只是其中一種)
同樣,使用方法引用方式去創(chuàng)建函數(shù)式接口實(shí)例也必須遵守方法的定義,看下此處println方法源碼
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
接收一個(gè)參數(shù),并不返回值,編譯通過。
最后我們來看下創(chuàng)建函數(shù)式接口的最后一種,第三種方式:構(gòu)造方法引用 ,繼續(xù)改程序
public class Test1 { public static void main(String[] args) { Listlist = Arrays.asList(1,2,3,4,5,6,7,8,9,10); //構(gòu)造方法引用 list.forEach(Test1::new); } Test1(Integer i){ System.out.println(i); } }
構(gòu)造方法引用的語法是:類名::new
我們給Test1新添加了一個(gè)構(gòu)造方法,該構(gòu)造方法接收一個(gè)參數(shù),不返回值,編譯通過。(僅為展示構(gòu)造方法引用的用法)
結(jié)合上一篇文章可以總結(jié)一下,創(chuàng)建函數(shù)式接口類型的三種方式:
1.lambda表達(dá)式
2.方法引用
3.構(gòu)造方法引用
注意:無論是哪種方式,必須要符合抽象方法的方法定義
小結(jié):本篇我們首先介紹了接口中的默認(rèn)方法,然后又分別用幾段程序代碼展示了方法引用和構(gòu)造方法引用的使用方式,后續(xù)還會(huì)提供一些示例來加深理解,如果覺得本篇文章對(duì)你有所幫助幫忙贊一下哈。
下一篇
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70678.html
摘要:新特性總覽標(biāo)簽本文主要介紹的新特性,包括表達(dá)式方法引用流默認(rèn)方法組合式異步編程新的時(shí)間,等等各個(gè)方面。還有對(duì)應(yīng)的和類型的函數(shù)連接字符串廣義的歸約匯總起始值,映射方法,二元結(jié)合二元結(jié)合。使用并行流時(shí)要注意避免共享可變狀態(tài)。 Java8新特性總覽 標(biāo)簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達(dá)式、方法引用、流(Stream API)、默認(rèn)方...
摘要:類與對(duì)象基本概念如果在之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。如果一個(gè)類被聲明為,則不能被繼承。命名空間通過關(guān)鍵字來聲明。 類與對(duì)象 基本概念 new:如果在 new 之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個(gè)實(shí)例 ...
摘要:將構(gòu)造函數(shù)的作用域賦值給新的對(duì)象因此指向了這個(gè)新對(duì)象。以這種方式定義的構(gòu)造函數(shù)是定義在對(duì)象在瀏覽器是對(duì)象中的。構(gòu)造函數(shù)在不返回值的情況下,默認(rèn)會(huì)返回新對(duì)象實(shí)例。在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 創(chuàng)建對(duì)象 雖然Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個(gè)對(duì)象,但是這些方式有明顯的缺點(diǎn):使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量的重復(fù)代碼。為解決這個(gè)問題,人們開始...
摘要:本文挑選了到大廠面試題,大家在閱讀時(shí),建議不要先看我的答案,而是自己先思考一番。構(gòu)造函數(shù)返回值是或,是返回的是種返回的對(duì)象。 今年來,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 本文挑選了20到大廠面試題,大家在閱讀時(shí),建議不要先看我的答案,而是自己先思考一番。盡管,本文所有的答案,都是我在翻閱各種資料,思考并驗(yàn)證之...
閱讀 3433·2021-11-10 11:36
閱讀 3326·2021-10-08 10:21
閱讀 2939·2021-09-29 09:35
閱讀 2503·2021-09-22 16:06
閱讀 4097·2021-09-09 09:33
閱讀 1388·2019-08-30 15:44
閱讀 3234·2019-08-30 10:59
閱讀 3063·2019-08-29 15:32