摘要:概述簡介若體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用可以將方法引用理解為表達(dá)式的另外一種表現(xiàn)形式方法引用的三種形式對(duì)象的引用實(shí)例方法名類名靜態(tài)方法名類名實(shí)例方法名注意方法引用所引用的方法的參數(shù)列表與返回值類型,需要與函數(shù)式接口中抽象
1. 概述 1.1 簡介
若 Lambda 體中的功能,已經(jīng)有方法提供了實(shí)現(xiàn),可以使用方法引用(可以將方法引用理解為 Lambda 表達(dá)式的另外一種表現(xiàn)形式)
方法引用的三種形式
對(duì)象的引用::實(shí)例方法名
類名::靜態(tài)方法名
類名::實(shí)例方法名
2. 方法引用 2.2 對(duì)象的引用::實(shí)例方法名注意:
①方法引用所引用的方法的參數(shù)列表與返回值類型,需要與函數(shù)式接口中抽象方法的參數(shù)列表和返回值類型保持一致!
②若 Lambda 的參數(shù)列表的第一個(gè)參數(shù),是實(shí)例方法的調(diào)用者,第二個(gè)參數(shù)(或無參)是實(shí)例方法的參數(shù)時(shí),格式: ClassName::MethodName
public class Employee implements Serializable { private int id; private String name; private int age; private double salary; public Employee() { } public Employee(String name) { this.name = name; } public Employee(String name, int age) { this.name = name; this.age = age; } public Employee(int id, String name, int age, double salary) { this.id = id; this.name = name; this.age = age; this.salary = salary; } // 省略 getter 和 setter 方法 }
@Test public void t1() { // lambda 表達(dá)式方式 PrintStream printStreamLamBda = System.out; Consumer2.3 類名::靜態(tài)方法名consumerLambda = (x) -> printStreamLamBda.println(x); consumerLambda.accept("hello lambda"); // 方法引用方式 PrintStream printStream = System.out; // 使用方法引用前提是 Consumer 的 accept 方法的參數(shù)列表和返回值必須與 println 方法的參數(shù)列表和返回值一致(參考注意①) Consumer con = printStream::println; con.accept("hello method!"); } @Test public void t2(){ Employee emp = new Employee(100,"ling",18,10000); // lambda 表達(dá)式方式 Supplier supplierLambda = () -> emp.getName(); System.out.println(supplierLambda.get()); // 方法引用方式 Supplier supplier = emp::getName; System.out.println(supplier.get()); }
@Test public void t3(){ BiFunction2.4 類名::實(shí)例方法名fun = (x, y) -> Math.max(x, y); System.out.println("Lambda : " + fun.apply(1.5, 22.2)); System.out.println("------------------------------------"); BiFunction fun2 = Math::max; System.out.println("方法引用 : " + fun2.apply(1.2, 1.5)); }
在 Employee 中添加方法
public String show() { return "測試方法引用!"; }
測試方法
@Test public void test5(){ BiPredicate3. 構(gòu)造器引用 3.1 簡介bp = (x, y) -> x.equals(y); System.out.println(bp.test("ling", "ling")); System.out.println("------------------------------------"); BiPredicate bp2 = String::equals; System.out.println(bp2.test("ling", "ling")); System.out.println("------------------------------------"); Function fun = (e) -> e.show(); System.out.println(fun.apply(new Employee())); System.out.println("------------------------------------"); Function fun2 = Employee::show; System.out.println(fun2.apply(new Employee())); }
使用構(gòu)造器引用來創(chuàng)建對(duì)象
注:被調(diào)用的構(gòu)造器的參數(shù)列表,需要與函數(shù)式接口中參數(shù)列表保持一致!
構(gòu)造器引用的語法格式
類名::new
3.2 實(shí)例@Test public void t5(){ // Lambda 方式調(diào)用無參構(gòu)造器 Supplier4. 數(shù)組引用 4.1 簡介sup = () -> new Employee(); System.out.println(sup.get()); System.out.println("------------------------------------"); // 構(gòu)造器引用方式調(diào)用無參構(gòu)造器 Supplier sup2 = Employee::new; System.out.println(sup2.get()); // 調(diào)用一個(gè)參數(shù)構(gòu)造器 Function fun = Employee::new; // 調(diào)用兩個(gè)個(gè)參數(shù)構(gòu)造器 BiFunction fun2 = Employee::new; }
用于創(chuàng)建數(shù)組
語法格式
類型[]::new;
4.2 實(shí)例@Test public void t6() { // Lambda 方式 FunctionfunLambda = (args) -> new String[args]; String[] strsLambda = funLambda.apply(50); System.out.println("Lambda : " + strsLambda.length); System.out.println("------------------------------------"); // 數(shù)組引用方式 Function func = String[]::new; String[] strArr = func.apply(100); System.out.println("arr : " + strArr.length); }
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之方法引用
作者:凌風(fēng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72756.html
以下是Java技術(shù)棧微信公眾號(hào)發(fā)布的關(guān)于 Java 的技術(shù)干貨,從以下幾個(gè)方面匯總。 Java 基礎(chǔ)篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進(jìn)階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎(chǔ)篇 8張圖帶你輕松溫習(xí) Java 知識(shí) Java父類強(qiáng)制轉(zhuǎn)換子類原則 一張圖搞清楚 Java 異常機(jī)制 通用唯一標(biāo)識(shí)碼UUID的介紹及使用 字符串...
摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個(gè)接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個(gè)默認(rèn)方法??偨Y(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實(shí) Java8 的新特性的出現(xiàn),給開發(fā)者帶來了非常大的便利,可能剛剛開始的時(shí)候會(huì)有點(diǎn)不習(xí)慣的這種寫法,但是,當(dāng)你真正的熟悉了之后,你一定會(huì)愛上這些新的...
摘要:大家好,我是樂字節(jié)的小樂,上一次我們說到了核心特性之函數(shù)式接口,接下來我們繼續(xù)了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達(dá)式。感謝光臨閱讀小樂的,敬請(qǐng)關(guān)注樂字節(jié)后續(xù)將繼續(xù)講述等前沿知識(shí)技術(shù)。 大家好,我是樂字節(jié)的小樂,上一次我們說到了Java8核心特性之函數(shù)式接口,接下來我們繼續(xù)了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
摘要:上一篇小樂介紹了新特性函數(shù)式接口,大家可以點(diǎn)擊回顧。中引入方法引用新特性用于簡化應(yīng)用對(duì)象方法的調(diào)用,方法引用是用來直接訪問類或者實(shí)例的已經(jīng)存在的方法或者構(gòu)造方法。方法引用是一種更簡潔易懂的表達(dá)式。 上一篇小樂介紹了《Java8新特性-函數(shù)式接口》,大家可以點(diǎn)擊回顧。這篇文章將接著介紹Java8新特性之方法引用。 Java8 中引入方法引用新特性,用于簡化應(yīng)用對(duì)象方法的調(diào)用,?方法引用是...
摘要:方法引用在之前只能進(jìn)行值傳遞,方法是不能傳遞的。首先方法接受了一個(gè)類型的對(duì)象,方法是獲取所有的文件,是用來存儲(chǔ)篩選之后的元素,循環(huán)所有獲得到的文件數(shù)組,然后調(diào)用中的方法來進(jìn)行條件篩選,放入后返回。 方法引用: 在Java 8之前只能進(jìn)行值傳遞,方法是不能傳遞的。如果你想調(diào)用一個(gè)方法你必須先獲取到它所在的類的實(shí)例,然后再通過實(shí)例去調(diào)用這個(gè)方法,但是Java 8新增了方法引用這個(gè)新特性可以...
閱讀 3770·2021-10-13 09:39
閱讀 3813·2021-09-24 09:48
閱讀 1207·2021-09-01 10:30
閱讀 2539·2019-08-30 15:55
閱讀 1788·2019-08-29 16:39
閱讀 2307·2019-08-26 13:55
閱讀 3063·2019-08-26 12:23
閱讀 1645·2019-08-26 11:59