Lambda 表達式 in java 8

Lambda 表達式 in Java 8

  • Lambda表達式是java 8 新增的特性
  • Lambda表達式主要做用:支持將代碼塊做爲方法參數,容許使用更簡潔的代碼建立函數式接口的實例,是匿名內部類的一種簡化,能夠部分取代匿名內部類的做用。
  • 函數式接口:只有一個抽象方法的接口。
  • Lambda表達式又稱爲匿名函數(anonymous function),表示一類無需定義標識符(函數名)的函數或者子程序,能夠看作是一種語法糖

Lambda 表達式語法格式

Lambda表達式在java中由三部分組成:java

  • 形參列表:形參列表容許省略形參類型,若是形參列表只有一個參數,形參列表外的圓括號也能夠省略
  • 箭頭->:箭頭不可省略
  • 代碼塊:若是代碼塊只有一條語句,容許省略代碼塊的花括號;更有甚者,只有一條return語句,能夠省略return關鍵字。
interface Eatable{
    void taste();
}

interface Flyable{
    void fly(String weathrer);
}

interface Addable{
    int add(int a,int b);
}

public class LambdaTest {
    public void eat(Eatable e) {
        e.taste();
        System.out.println(e);
    }
    public void fly(Flyable f) {
        f.fly("好天氣");
        System.out.println(f);
    }
    public void add(Addable a) {
        System.out.println(a.add(5, 3));
    }
    
    public static void main(String[] args) {
        LambdaTest test = new LambdaTest();
        test.eat(()->System.out.println("蘋果"));
        test.fly(weater->{
            System.out.println("哈哈哈");
            System.out.println("能夠飛行");
        });
        // 省略形參類型 省略花括號
        test.add((a,b)->a+b);
    }
}

函數式接口

  • 函數式接口是指只包含一個抽象方法的接口,(可有其餘默認方法(default修飾)或者類方法)java 8 中有大量的函數式接口如最多見的:Runnable,ActionListener,並提供了@FunctionInterface註解,告訴編譯器執行更嚴格的檢查。
Runnbale r =()->{
    for(int i =0;i<100;i++){
        System.out.println(i);
    }
}; // 注意分號
  • Lamdba 表達式的目標類型只能是函數式接口。
  • Lambda 表達式常應用場景:
    1. 將Lambda表達式賦值給函數式接口類型的變量
    2. 做爲函數接口類型的參數傳給某個方法
    3. 使用函數式接口對Lambda表達式進行強制類型轉換
Object obj = (Runnable)()->{
    System.out.println(...);
};

方法引用和構造器引用

  • 應用場景:代碼塊只有一條語句,而且該語句爲調用方法或者構造器
  • 應用目的:使Lambda表達式的語法更爲簡潔
  • 應用方式:::
@FunctionalInterface
interface Converter{
    Integer convert(String from);
}

// 類方法
Converter con = from->Integer.valueOf(from);
Converter con1 = Integer::valueOf;

// 對象方法
Converter con2 = from->"hhhh".indexOf(from);
Converter con3 = "hhhh"::indexOf;

// 構造器相似
// ::new

Lambda表達式與匿名內部類的聯繫和區別

  • Lambda表達式簡化了部分匿名內部類的寫法(函數式接口),表現性質和匿名內部類一致,能夠訪問effective final局部變量,和外部類成員變量
  • 匿名內部類的應用範圍更廣,它能夠爲任何接口建立實例,也能夠服務於抽象類和普通類
  • 注意Lambda表達式的代碼塊不容許調用接口中定義的默認方法
相關文章
相關標籤/搜索