我們可以將lambda表達式作為參數(shù)傳遞給方法。
以下代碼創(chuàng)建了一個名為 Calculator
的函數(shù)接口。
在 Calculator
中有一個稱為 calculate
的方法,它接受兩個 int
參數(shù)并返回一個 int
值。
在 Main
類中有一個引擎方法,它接受函數(shù)接口Calculator
作為參數(shù)。它從計算器調(diào)用計算方法并輸出結(jié)果。
在主方法中,我們用不同的lambda表達式調(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表達式。
引擎方法的行為被參數(shù)化。
通過其參數(shù)更改方法的行為稱為行為參數(shù)化。
在行為參數(shù)化中,我們將在lambda表達式中封裝的邏輯傳遞給數(shù)據(jù)的方法。
編譯器并不總是可以推斷l(xiāng)ambda表達式的類型。
一種情況是將lambda表達式傳遞給重載的方法。
在以下代碼中有兩個函數(shù)接口。 一個是 int
值計算,另一個用于 long
值。
在Main類中有稱為 engine
的重載方法。 一個是期望 IntCalculator
,另一個是 LongCalculator
。
在main方法中,我們必須指定lambda表達式的參數(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表達式更改為explicit。這是為上面的代碼做的。
或者我們可以使用cast如下。當(dāng)?shù)谝淮握{(diào)用引擎時,我們將lambda表達式轉(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表達式作為參數(shù)。我們可以將lambda表達式分配給一個函數(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é)果。
更多建議: