我們可以將lambda表達(dá)式作為參數(shù)傳遞給方法。
以下代碼創(chuàng)建了一個(gè)名為 Calculator
的函數(shù)接口。
在 Calculator
中有一個(gè)稱為 calculate
的方法,它接受兩個(gè) int
參數(shù)并返回一個(gè) int
值。
在 Main
類中有一個(gè)引擎方法,它接受函數(shù)接口Calculator
作為參數(shù)。它從計(jì)算器調(diào)用計(jì)算方法并輸出結(jié)果。
在主方法中,我們用不同的lambda表達(dá)式調(diào)用引擎方法四次。
public class Main { public static void main(String[] argv) { engine((x,y)-> x + y); engine((x,y)-> x * y); engine((x,y)-> x / y); engine((x,y)-> x % y); } private static void engine(Calculator calculator){ int x = 2, y = 4; int result = calculator.calculate(x,y); System.out.println(result); } } @FunctionalInterface interface Calculator{ int calculate(int x, int y); }
上面的代碼生成以下結(jié)果。
engine
方法的結(jié)果取決于傳遞給它的lambda表達(dá)式。
引擎方法的行為被參數(shù)化。
通過其參數(shù)更改方法的行為稱為行為參數(shù)化。
在行為參數(shù)化中,我們將在lambda表達(dá)式中封裝的邏輯傳遞給數(shù)據(jù)的方法。
編譯器并不總是可以推斷l(xiāng)ambda表達(dá)式的類型。
一種情況是將lambda表達(dá)式傳遞給重載的方法。
在以下代碼中有兩個(gè)函數(shù)接口。 一個(gè)是 int
值計(jì)算,另一個(gè)用于 long
值。
在Main類中有稱為 engine
的重載方法。 一個(gè)是期望 IntCalculator
,另一個(gè)是 LongCalculator
。
在main方法中,我們必須指定lambda表達(dá)式的參數(shù),以指示我們要使用的重載函數(shù)的編譯器。
public class Main { public static void main(String[] argv) { engine((int x,int y)-> x + y); engine((long x, long y)-> x * y); engine((int x,int y)-> x / y); engine((long x,long y)-> x % y); } private static void engine(IntCalculator calculator){ int x = 2, y = 4; int result = calculator.calculate(x,y); System.out.println(result); } private static void engine(LongCalculator calculator){ long x = 2, y = 4; long result = calculator.calculate(x,y); System.out.println(result); } } @FunctionalInterface interface IntCalculator{ int calculate(int x, int y); } @FunctionalInterface interface LongCalculator{ long calculate(long x, long y); }
上面的代碼生成以下結(jié)果。
要解決歧義,我們可以通過指定參數(shù)的類型將隱式lambda表達(dá)式更改為explicit。這是為上面的代碼做的。
或者我們可以使用cast如下。當(dāng)?shù)谝淮握{(diào)用引擎時(shí),我們將lambda表達(dá)式轉(zhuǎn)換為IntCalculator
。
public class Main { public static void main(String[] argv) { engine((IntCalculator) ((x,y)-> x + y)); engine((long x, long y)-> x * y); engine((int x,int y)-> x / y); engine((long x,long y)-> x % y); } private static void engine(IntCalculator calculator){ int x = 2, y = 4; int result = calculator.calculate(x,y); System.out.println(result); } private static void engine(LongCalculator calculator){ long x = 2, y = 4; long result = calculator.calculate(x,y); System.out.println(result); } } @FunctionalInterface interface IntCalculator{ int calculate(int x, int y); } @FunctionalInterface interface LongCalculator{ long calculate(long x, long y); }
上面的代碼生成以下結(jié)果。
或者我們可以避免直接使用lambda表達(dá)式作為參數(shù)。我們可以將lambda表達(dá)式分配給一個(gè)函數(shù)接口,然后將該變量傳遞給該方法。下面的代碼顯示了這種技術(shù)。
public class Main { public static void main(String[] argv) { IntCalculator iCal = (x,y)-> x + y; engine(iCal); engine((long x, long y)-> x * y); engine((int x,int y)-> x / y); engine((long x,long y)-> x % y); } private static void engine(IntCalculator calculator){ int x = 2, y = 4; int result = calculator.calculate(x,y); System.out.println(result); } private static void engine(LongCalculator calculator){ long x = 2, y = 4; long result = calculator.calculate(x,y); System.out.println(result); } } @FunctionalInterface interface IntCalculator{ int calculate(int x, int y); } @FunctionalInterface interface LongCalculator{ long calculate(long x, long y); }
上面的代碼生成以下結(jié)果。
更多建議: