我們可以通過兩種方式獲得一個實例方法引用,從對象實例或從類名。
基本上我們有以下兩種形式。
這里實例
表示任何對象實例。 ClassName
是的名稱類,例如 String
, Integer
。
實例
和 ClassName
稱為接收器。更具體地說, instance
被稱為有界接收器,而 ClassName
被稱為無界接收器。
我們稱為實例有界接收器,因為接收器被限制到實例。
ClassName
是未經(jīng)過排隊的接收器,因為接收器以后有界。
綁定接收器接收器具有以下形式:
instance::MethodName
在下面的代碼中,我們使用buildin系統(tǒng)函數(shù)接口Supplier作為lambda表達式類型。
首先,我們以正常的方式定義一個lambda表達式。 lambda表達式不接受參數(shù),并返回字符串 'w3cschool.cn' 的長度,
我們使用 'w3cschool.cn' 創(chuàng)建一個String實例,并使用它的length方法作為實例方法引用。
綁定意味著我們已經(jīng)指定了實例。
以下示例顯示如何使用沒有參數(shù)的綁定接收器和方法來創(chuàng)建實例方法引用。
import java.util.function.Supplier; public class Main{ public static void main(String[] argv){ Supplier<Integer> supplier = () -> "m.hgci.cn".length(); System.out.println(supplier.get()); Supplier<Integer> supplier1 = "m.hgci.cn"::length; System.out.println(supplier1.get()); } }
上面的代碼生成以下結(jié)果。
以下示例顯示如何使用綁定接收器和方法與參數(shù)創(chuàng)建實例方法引用。
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("m.hgci.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
,因為函數(shù)接口的輸入類型為 String
。
lambda表達式在使用時獲取輸入。
以下代碼使用String length方法作為unbind實例方法引用。
String length方法通常在字符串值實例上調(diào)用,并返回字符串實例的長度。因此,輸入是String類型,輸出是int類型,這是匹配buildin函數(shù)功能接口。
每次我們調(diào)用 str Length Func
,我們傳入一個字符串值,并從傳遞的字符串值中調(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 ="m.hgci.cn"; int len = strLengthFunc.apply(name); System.out.println("name = " + name + ", length = " + len); name ="www.m.hgci.cn"; len = strLengthFunc.apply(name); System.out.println("name = " + name + ", length = " + len); } }
上面的代碼生成以下結(jié)果。
下面的代碼定義了一個具有稱為append的靜態(tài)方法的類Util。
append
方法接受兩個 String
類型參數(shù),并返回一個 String
類型的結(jié)果。
然后使用 append
方法創(chuàng)建一個lambda表達式并賦值給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 ="m.hgci.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
僅在實例上下文中使用,引用覆蓋的方法。
我們可以用下面的語法來創(chuàng)建是指在父類型的實例方法的方法引用。
ClassName.super::instanceMethod
下面的代碼定義了一個稱為 ParentUtil
的父類。在 ParentUtil
中有一個名為 append
的方法,它將兩個String值附加在一起。
然后創(chuàng)建一個名為 Util
的子類并擴展 ParentUtil
。
在 Util
類中,覆蓋 append
方法。
在Util的構(gòu)造函數(shù)中,我們創(chuàng)建兩個lambda表達式,一個是使用Util的append方法,另一個是使用ParentUtil類的append方法。
我們使用 this::append
引用當(dāng)前類,同時使用 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 ="m.hgci.cn"; String s= strFunc.apply(name," hi"); System.out.println(s); strFunc = Util.super::append; name ="m.hgci.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é)果。
更多建議: