Java基礎——Lambda表達式

Lambda表達式是Java8的重要更新。Lambda表達式支持將代碼塊作爲方法參數,Lambda表達式允許使用更簡潔的代碼來創建只有一個抽象方法的接口(這種接口被稱爲函數式接口)的實例。

首先,我們先使用匿名內部類來寫一個例子,然後對比Lambda表達式。
先寫一個接口:

public interface Command {

    //接口裏定義的process方法用於封裝“處理行爲”
    void process(int[] target);
}

匿名內部類:

public class CommandTest {

    public static void main(String[] args){
        ProcessArray pa = new ProcessArray();
        int[] target = {3,-4,6,4};
        //處理數組,具體處理行爲取決於匿名內部類

        pa.process(target, new Command(){

            @Override
            public void process(int[] target) {
                // TODO 自動生成的方法存根
                int sum = 0;
                for(int tmp : target){
                    sum += tmp;
                }
                System.out.println("數組元素的總和是:" + sum);
            }

        });
    }
}

Lambda表達式:

public class CommandTest2 {

    public static void main(String[] args){
        ProcessArray pa = new ProcessArray();
        int[] array = {3,-4,6,4};
        pa.process(array, (int[] target)->{
            int sum = 0;
            for(int tmp : target){
                sum += tmp;
            }
            System.out.println("數組元素的總和:" + sum);
        });
    }
}

由上面可以看出,Lambda表達式簡化創建匿名內部類對象。

Lambda表達式的主要作用就是代替匿名內部類的繁瑣語法。它由三部分組成。
——形參列表。形參列表允許省略形參類型。如果形參列表中只有一個參數,甚至連形參列表的圓括號也可以省略。
——箭頭(->)。必須通過英文中畫線和大於符號組成。
——代碼塊。如果代碼塊只包含一條語句,Lambda表達式允許省略代碼塊的花括號,那麼這條語句就不要用花括號表示語句結束。Lambda代碼塊中只有一條return語句,甚至可以省略return關鍵字。Lambda表達式需要返回值,而它的代碼塊中僅有一條省略了return的語句,Lambda表達式會自動返回這條語句的值。

Lambda表達式的幾種簡化寫法:

interface Eatable{
    void taste();
}
interface Flyable{
    void fly(String weather);
}
interface Addable{
    int add(int a, int b);
}
public class LambdaQs {
    //調用該方法需要Eatable對象
    public void eat(Eatable e){
        System.out.println("我在吃蘋果");
        e.taste();
    }
    //調用該方法需要Flyable對象
    public void drive(Flyable f){
        System.out.println("我正在駕駛:" + f);
        f.fly("【碧空如洗的晴空】");
    }
    //調用該方法需要Addable對象
    public void test(Addable add){
        System.out.println("5與3的和爲:" + add.add(5, 3));
    }
    public static void main(String[] args){
        LambdaQs lq = new LambdaQs();
        //Lambda表達式的代碼塊只有一條語句,可以省略花括號
        lq.eat(()->System.out.println("蘋果的味道不錯!"));
        //Lambda表達式的形參列表只有一個形參,可以省略圓括號
        lq.drive(weather->{
            System.out.println("今天的天氣是:" + weather);
            System.out.println("直升機飛行平穩");
        });
        //Lambda表達式的代碼塊只有一條語句,可以省略花括號
        //代碼塊中只有一條語句,即使該表達式需要返回值,也可以省略return關鍵字
        lq.test((a,b)->a + b);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章