Java中Lambda表示式基礎及使用詳解

季沐測試筆記發表於2021-08-24

概述

Lambda 是JDK 8 的重要新特性。它允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊,使Java程式碼更加優雅。

標準格式

  • 三要素:形式引數 箭頭 程式碼塊
  • 格式:(形式引數)->{程式碼塊}
  • 形式引數:如果多個引數用逗號隔開,無參留空
  • ->:英文中劃線和大於號組成
  • 程式碼塊:具體要做的事

使用前提

  • 有一個介面
  • 介面中有且僅有一個抽象方法

舉例:

1、無參無返回
定義一個介面

public interface Eatable {
    void eat();
}

介面實現類

public class EatableImpl implements Eatable{
    @Override
    public void eat() {
        System.out.println("一天一蘋果");
    }
}

測試類

public class EatableDemo {
    public static void main(String[] args) {
        //主方法呼叫useEatable
        Eatable e = new EatableImpl();
        useEatable(e);
        //匿名內部類
        useEatable(new Eatable() {
            @Override
            public void eat() {
                System.out.println("一天一蘋果");
            }
        });

        //lambda表示式
        useEatable(() -> {
            System.out.println("一天一蘋果");
        });



    }

    private static void useEatable(Eatable e){
        e.eat();
    }
}

2、有參無返回程式碼示例

public interface Eatable {
    void eat(String name);
}
public class EatDemo {
    public static void main(String[] args) {
        useEat((String name) -> {
            System.out.println(name);
            System.out.println("輸出的啥");
        });
    }

    private static void useEat(Eatable e){
        e.eat("蘋果");
    }

}

3、有參有返回

public interface Addable {
    int add(int x,int y);
}
public class AddableDemo {
    public static void main(String[] args) {
        useAddable( (int x,int y ) -> {
            return x+y;
        });
    }

    private static void useAddable(Addable a){
        int sum = a.add(5, 7);
        System.out.println(sum);
    }

}

省略模式

  • 引數的型別可省略,多個引數時候不可只省略一個;
  • 如果引數有且僅有一個可省略大括號和分號;
  • 如果程式碼塊的語句只有一條,可省略大括號和分號(有return時return也省略掉)

注意事項

  • 必須要有介面,介面中有且僅有一個抽象方法
  • 必須有上下文環境,才能推匯出Lambda對應的介面:區域性變數的賦值、呼叫方法的引數

Lambda表示式和匿名內部類的區別

所需型別不同:

  • 匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
  • Lambda表示式:只能是介面

使用限制不同:

  • 如果介面中有且僅有一個抽象類,兩者都可以使用
  • 介面中多於一個抽象類,只能使用匿名內部類

實現原理不同:

  • 匿名內部類:編譯之後,產生一個單獨的.class位元組碼檔案
  • Lambda表示式:編譯之後,沒有單獨的.class位元組碼檔案,對應的位元組碼會在執行時動態的生成

相關文章