天天看點

Java 8 中的拉姆達表達式是什麼?Java 8 中的拉姆達表達式是什麼?

Java 8 中的拉姆達表達式是什麼?

拉姆達表達式就是一個匿名函數。在 C#中,拉姆達表達式是一個委托類型,是以拉姆達表達式可以指派給一個委托變量。

Java 中,沒有委托,Java 的設計者隻能想出一些曲折的方法來實作拉姆達表達式,這種方式就是用接口。

這種接口叫做函數式接口。但是這個接口比較特殊,必須是隻有一個抽象方法(接口中的方法,無論是否加 abstract,都是抽象的,加不加都可以)。如果還需定義别的抽象方法,那隻能定義 Object 類中的同名方法,事實上,例如 toString 和 Clone 這種方法的聲明并不是抽象的,Java API 中某些接口重新聲明 Object 類中的方法,目的是為了關聯 javadoc 中的注釋而已。

下面是一個合法的函數式接口:

@FunctionalInterface
public interface myFunctionalInterface {
    int dosomething(int c, int b);
    String toString(); // same to Object.toString
    int hashCode(); // same to Object.hashCode
    boolean equals(Object obj); // same to Object.equals
}           

複制

隻有一個 dosomething 抽象方法,其它抽象方法是 Object 中的同名方法。

這樣一個接口的 dosomething 方法就對應了拉姆達表達式,也就是說拉姆達表達式可以指派給這個接口了。

注意的是@FunctionalInterface 注解不是必須的,但是建議加上,讓編譯器可以有所準備,代碼可讀性也更好。

下面的代碼是合法的:

myFunctionalInterface m=(x,y)->{return x+y;};             

複制

還能這樣寫,定義一個方法,參數包含一個拉姆達表達式。

public static int f(myFunctionalInterface m,int a,int b)
{
    return m.dosomething(a, b);
}           

複制

調用

int sum=f((x,y)->{return x+y;},1,2);
int sub=f((x,y)->{return x-y;},3,4);           

複制