我們可以通過兩種方式獲得一個(gè)實(shí)例方法引用,從對(duì)象實(shí)例或從類名。
基本上我們有以下兩種形式。
這里實(shí)例
表示任何對(duì)象實(shí)例。 ClassName
是的名稱類,例如 String
, Integer
。
實(shí)例
和 ClassName
稱為接收器。更具體地說, instance
被稱為有界接收器,而 ClassName
被稱為無界接收器。
我們稱為實(shí)例有界接收器,因?yàn)榻邮掌鞅幌拗频綄?shí)例。
ClassName
是未經(jīng)過排隊(duì)的接收器,因?yàn)榻邮掌饕院笥薪纭?/span>
綁定接收器接收器具有以下形式:
instance::MethodName
在下面的代碼中,我們使用buildin系統(tǒng)函數(shù)接口Supplier作為lambda表達(dá)式類型。
首先,我們以正常的方式定義一個(gè)lambda表達(dá)式。 lambda表達(dá)式不接受參數(shù),并返回字符串 'w3cschool.cn' 的長度,
我們使用 'w3cschool.cn' 創(chuàng)建一個(gè)String實(shí)例,并使用它的length方法作為實(shí)例方法引用。
綁定意味著我們已經(jīng)指定了實(shí)例。
以下示例顯示如何使用沒有參數(shù)的綁定接收器和方法來創(chuàng)建實(shí)例方法引用。
import java.util.function.Supplier; public class Main{ public static void main(String[] argv){ Supplier<Integer> supplier = () -> "eska-fuses.cn".length(); System.out.println(supplier.get()); Supplier<Integer> supplier1 = "eska-fuses.cn"::length; System.out.println(supplier1.get()); } }
上面的代碼生成以下結(jié)果。
以下示例顯示如何使用綁定接收器和方法與參數(shù)創(chuàng)建實(shí)例方法引用。
import java.util.function.Consumer; public class Main{ public static void main(String[] argv){ Util util = new Util(); Consumer<String> consumer = str -> util.print(str); consumer.accept("Hello"); Consumer<String> consumer1 = util::print; consumer1.accept("eska-fuses.cn"); util.debug(); } } class Util{ private int count=0; public void print(String s){ System.out.println(s); count++; } public void debug(){ System.out.println("count:" + count); } }
上面的代碼生成以下結(jié)果。
未綁定的接收器使用以下語法
ClassName::instanceMethod
它與我們用來引用靜態(tài)方法的語法相同。
從以下代碼,我們可以看到輸入類型是ClassName的類型。
在下面的代碼中,我們使用 String:length
,因?yàn)楹瘮?shù)接口的輸入類型為 String
。
lambda表達(dá)式在使用時(shí)獲取輸入。
以下代碼使用String length方法作為unbind實(shí)例方法引用。
String length方法通常在字符串值實(shí)例上調(diào)用,并返回字符串實(shí)例的長度。因此,輸入是String類型,輸出是int類型,這是匹配buildin函數(shù)功能接口。
每次我們調(diào)用 str Length Func
,我們傳入一個(gè)字符串值,并從傳遞的字符串值中調(diào)用length方法。
import java.util.function.Function; public class Main{ public static void main(String[] argv){ Function<String, Integer> strLengthFunc = String::length; String name ="eska-fuses.cn"; int len = strLengthFunc.apply(name); System.out.println("name = " + name + ", length = " + len); name ="www.eska-fuses.cn"; len = strLengthFunc.apply(name); System.out.println("name = " + name + ", length = " + len); } }
上面的代碼生成以下結(jié)果。
下面的代碼定義了一個(gè)具有稱為append的靜態(tài)方法的類Util。
append
方法接受兩個(gè) String
類型參數(shù),并返回一個(gè) String
類型的結(jié)果。
然后使用 append
方法創(chuàng)建一個(gè)lambda表達(dá)式并賦值給Java buildin BiFunction
函數(shù)接口。
append方法的簽名與BiFunction
函數(shù)接口中定義的抽象方法的簽名相匹配。
import java.util.function.BiFunction; public class Main{ public static void main(String[] argv){ BiFunction<String, String,String> strFunc = Util::append; String name ="eska-fuses.cn"; String s= strFunc.apply(name,"hi"); System.out.println(s); } } class Util{ public static String append(String s1,String s2){ return s1+s2; } }
上面的代碼生成以下結(jié)果。
關(guān)鍵字 super
僅在實(shí)例上下文中使用,引用覆蓋的方法。
我們可以用下面的語法來創(chuàng)建是指在父類型的實(shí)例方法的方法引用。
ClassName.super::instanceMethod
下面的代碼定義了一個(gè)稱為 ParentUtil
的父類。在 ParentUtil
中有一個(gè)名為 append
的方法,它將兩個(gè)String值附加在一起。
然后創(chuàng)建一個(gè)名為 Util
的子類并擴(kuò)展 ParentUtil
。
在 Util
類中,覆蓋 append
方法。
在Util的構(gòu)造函數(shù)中,我們創(chuàng)建兩個(gè)lambda表達(dá)式,一個(gè)是使用Util的append方法,另一個(gè)是使用ParentUtil類的append方法。
我們使用 this::append
引用當(dāng)前類,同時(shí)使用 Util.super::append
從父類引用方法。
import java.util.function.BiFunction; public class Main{ public static void main(String[] argv){ new Util(); } } class Util extends ParentUtil{ public Util(){ BiFunction<String, String,String> strFunc = this::append; String name ="eska-fuses.cn"; String s= strFunc.apply(name," hi"); System.out.println(s); strFunc = Util.super::append; name ="eska-fuses.cn"; s= strFunc.apply(name," Java Lambda Tutorial"); System.out.println(s); } @Override public String append(String s1,String s2){ System.out.println("child append"); return s1+s2; } } class ParentUtil{ public String append(String s1,String s2){ System.out.println("parent append"); return s1+s2; } }
上面的代碼生成以下結(jié)果。
更多建議: