Java Lambda行為參數(shù)化

2018-03-13 10:35 更新

Java Lambda行為參數(shù)化


我們可以將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ù)的方法。

行為參數(shù)化模糊性

編譯器并不總是可以推斷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é)果。

注意1

要解決歧義,我們可以通過指定參數(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é)果。

注意2

或者我們可以避免直接使用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é)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號