lambda表達(dá)式表示在函數(shù)接口中定義的匿名函數(shù)。
方法引用使用現(xiàn)有方法創(chuàng)建lambda表達(dá)式。
方法引用的一般語法是
Qualifier::MethodName
兩個(gè)連續(xù)的冒號(hào)充當(dāng)分隔符。
MethodName
是方法的名稱。
限定符
告訴在哪里找到方法引用。
例如,我們可以使用 String::length
從 String
類引用length方法。這里 String
是限定符, length
是方法名。
我們只需要指定方法名。
無需指定方法的參數(shù)類型和返回類型。
方法引用的目標(biāo)類型是功能接口。它確定方法的簽名并在必要時(shí)解析重載的方法。
有六種類型的方法引用。
靜態(tài)方法引用允許我們使用靜態(tài)方法作為lambda表達(dá)式。
靜態(tài)方法可以在類,接口或枚舉中定義。
以下代碼定義了兩個(gè)lambda表達(dá)式。
第一個(gè)lambda表達(dá)式func1
是通過定義輸入?yún)?shù)x并提供lambda表達(dá)式主體來創(chuàng)建的?;旧希@是創(chuàng)建lambda表達(dá)式的正常方式。
第二個(gè)lambda表達(dá)式func2
是通過從Integer類引用靜態(tài)方法創(chuàng)建的。
import java.util.function.Function; public class Main { public static void main(String[] argv) { // Using a lambda expression Function<Integer, String> func1 = x -> Integer.toBinaryString(x); System.out.println(func1.apply(10)); // Using a method reference Function<Integer, String> func2 = Integer::toBinaryString; System.out.println(func2.apply(10)); } }
從Integer類的靜態(tài)方法的簽名如下。
static String toBinaryString(int i)
上面的代碼生成以下結(jié)果。
以下代碼顯示了如何使用Integer.sum作為lambda表達(dá)式。
import java.util.function.BiFunction; public class Main { public static void main(String[] argv) { // Uses a lambda expression BiFunction<Integer, Integer, Integer> func1 = (x, y) -> Integer.sum(x, y); System.out.println(func1.apply(2, 3)); // Uses a method reference BiFunction<Integer, Integer, Integer> func2 = Integer::sum; System.out.println(func2.apply(2, 3)); } }
上面的代碼生成以下結(jié)果。
我們可以在靜態(tài)方法引用中使用重載的靜態(tài)方法。
當(dāng)重載方法時(shí),我們必須更加注意方法簽名和相應(yīng)的函數(shù)接口。
在下面的列表中,我們有來自Integer類的三個(gè)版本的valueOf()。
static Integer valueOf(int i) static Integer valueOf(String s) static Integer valueOf(String s, int radix)
以下代碼顯示了如何使用不同的目標(biāo)函數(shù)接口與重載的Integer.valueOf()靜態(tài)方法。
import java.util.function.BiFunction; import java.util.function.Function; public class Main{ public static void main(String[] argv){ // Uses Integer.valueOf(int) Function<Integer, Integer> func1 = Integer::valueOf; // Uses Integer.valueOf(String) Function<String, Integer> func2 = Integer::valueOf; // Uses Integer.valueOf(String, int) BiFunction<String, Integer, Integer> func3 = Integer::valueOf; System.out.println(func1.apply(7)); System.out.println(func2.apply("7")); System.out.println(func3.apply("101010101010", 2)); } }
上面的代碼生成以下結(jié)果。
更多建議: