網頁

2017/9/21

Java Lambda替代匿名內部類別範例

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(函式介面)。例如RunnableComparable都是只有一個抽像方法的介面,就是典型的Functional Interface。

範例中的interface都冠有@FunctionalInterface的annotation,@FunctionalInterface的作用是如果你的interface不是Functional Interface,則編譯器便會報錯提醒你需要修正,同時日後維護的人看這個annotation會清楚地知道此介面在程式中有使用Lambda語法。


如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。


沒有留言:

張貼留言