Java 8的Lambda Expresions(Labmda語法)可用來取代匿名內部類別(anonymous inner class)的寫法,令程式更簡潔可讀性更高,下面是一些基本範例。
public class Test {
public static void main(String[] args) {
// 匿名內部類別 anonymous inner class
InterfaceA a1 = new InterfaceA(){
@Override
public void doSomething() {
System.out.println("a1");
}
};
a1.doSomething();
// Lambda 無參數空實作
InterfaceA a2 = () -> {};
a2.doSomething();
// Lambda 無參數, 單行實作
InterfaceA a3 = () -> System.out.println("a3");
a3.doSomething();
// Lambda 無參數, 多行實作
InterfaceA a4 = () -> {
System.out.println("a4 - line1");
System.out.println("a4 - line2");
};
a4.doSomething();
// Lambda 單個參數, 單行實作
InterfaceB b1 = s -> System.out.println(s);
b1.printString("b1");
// Lambda 多個參數, 單行實作
InterfaceC c1 = (x, y) -> System.out.println("x + y = " + (x + y));;
c1.printXPlusY(2, 3);
// Lambda 無參數, 單行回傳值
InterfaceD d1 = () -> "d1";
System.out.println(d1.returnString());
// Lambda 多個參數, 多行回傳值
InterfaceE e1 = (x, y) -> {
System.out.println("e1");
return x + y;
};
System.out.println(e1.returnXPlusY(100, 900));
}
@FunctionalInterface
interface InterfaceA {
void doSomething();
}
@FunctionalInterface
interface InterfaceB {
void printString(String s);
}
@FunctionalInterface
interface InterfaceC {
void printXPlusY(int x, int y);
}
@FunctionalInterface
interface InterfaceD {
String returnString();
}
@FunctionalInterface
interface InterfaceE {
int returnXPlusY(int x, int y);
}
}
執行結果如下
a1
a3
a4 - line1
a4 - line2
b1
x + y = 5
d1
e1
1000
要特別提醒的是Lambda只能在只有一個抽象方法的介面使用。這種只有一個抽象方法的介面稱為Functional Interface(函式介面)。例如Runnable
和Comparable
都是只有一個抽像方法的介面,就是典型的Functional Interface。
範例中的interface都冠有@FunctionalInterface
的annotation,@FunctionalInterface
的作用是如果你的interface不是Functional Interface,則編譯器便會報錯提醒你需要修正,同時日後維護的人看這個annotation會清楚地知道此介面在程式中有使用Lambda語法。
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
沒有留言:
張貼留言