java lambda 多个参数_Java Lambda行为参数化
Java Lambda行為參數化
我們可以將lambda表達式作為參數傳遞給方法。
例子
以下代碼創建了一個名為Calculator的函數接口。
在Calculator中有一個稱為calculate的方法,它接受兩個int參數并返回一個int值。
在Main類中有一個引擎方法,它接受函數接口Calculator作為參數。它從計算器調用計算方法并輸出結果。
在主方法中,我們用不同的lambda表達式調用引擎方法四次。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);
}
上面的代碼生成以下結果。
注意
engine方法的結果取決于傳遞給它的lambda表達式。
引擎方法的行為被參數化。
通過其參數更改方法的行為稱為行為參數化。
在行為參數化中,我們將在lambda表達式中封裝的邏輯傳遞給數據的方法。
行為參數化模糊性
編譯器并不總是可以推斷lambda表達式的類型。
一種情況是將lambda表達式傳遞給重載的方法。
在以下代碼中有兩個函數接口。 一個是int值計算,另一個用于long值。
在Main類中有稱為engine的重載方法。 一個是期望IntCalculator,另一個是LongCalculator。
在main方法中,我們必須指定lambda表達式的參數,以指示我們要使用的重載函數的編譯器。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);
}
上面的代碼生成以下結果。
注意1
要解決歧義,我們可以通過指定參數的類型將隱式lambda表達式更改為explicit。這是為上面的代碼做的。
或者我們可以使用cast如下。當第一次調用引擎時,我們將lambda表達式轉換為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);
}
上面的代碼生成以下結果。
注意2
或者我們可以避免直接使用lambda表達式作為參數。我們可以將lambda表達式分配給一個函數接口,然后將該變量傳遞給該方法。下面的代碼顯示了這種技術。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);
}
上面的代碼生成以下結果。
總結
以上是生活随笔為你收集整理的java lambda 多个参数_Java Lambda行为参数化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 咸阳治少精无精最好的医院推荐
- 下一篇: 做喉镜多少钱一次啊?