函數式接口:
- 如果接口中只有一個抽象方法(包括繼承的),則該接口是一個函數式接口。
- 下面的SmartAdder 就不是函數式接口,因爲它有兩個add方法(繼承一個)
public interface Adder{
int add(int a, int b);
}
public interface SmartAdder extends Adder{
int add(double a, double b);
}
- 還可以使用FunctionalInterface註解來限定接口內只能有一個抽象方法。
@FunctionalInterface
public interface FunctionalInterfaceTest {
void print();
}
lambda表達式:只能使用函數式接口
public static void main(String[] args) {
// 使用匿名內部類實現
FunctionalInterfaceTest fit=new FunctionalInterfaceTest() {
@Override
public void print() {
System.out.println("使用匿名內部類實現");
}
};
fit.print();
// 使用Lambda表達式實現
// ():表示參數列表
// ->:連接符
// {}:方法體
FunctionalInterfaceTest fit1 = () -> {
System.out.println("使用Lambda表達式實現");
};
fit1.print();
// 如果方法體只有一句話,還可以省略大括號及一個分號
FunctionalInterfaceTest fit2 = () -> System.out.println("使用更簡潔的Lambda表達式");
fit2.print();
}
public static void main(String[] args) {
// Lambda表達式有一個參數
FunctionalInterfaceTest fit3 = (x) -> {
System.out.println("一個參數:"+x);
};
fit3.print(12);
// 如果只有一個參數可以省略圓括號,還可省略掉大括號
FunctionalInterfaceTest fit4 = x -> System.out.println("一個參數更簡潔:"+x);
fit4.print(22);
}
- 有兩個及以上參數,圓括號不可省略
- 方法體有兩行及以上代碼時,大括號不可省略。
- 有返回值
public static void main(String[] args) {
// Lambda表達式有返回值
FunctionalInterfaceTest fit3 = (x,y) -> {
return x+y;
};
int c = fit3.add(12,11);
System.out.println(c);
// 因爲方法體只有一條語句,可以省略大括號
// 注意在省略大括號時,將return關鍵字一塊省略,如下
// 對於有返回值的情況,大括號和return關鍵字是一塊出現一塊消失的。
FunctionalInterfaceTest fit3 = (x,y) -> x+y;
}