1. 程式人生 > 實用技巧 >Java自學第9期——Lambda表示式

Java自學第9期——Lambda表示式

1、入門

使用場景:如果建立函式式介面(該介面的抽象方法只能有一個)的例項時,使用Lambda表示式更加簡潔方便。

2、格式:

(形參列表) -> { 程式碼塊 }

3、簡化

只有一個引數時,可以省略圓括號();
程式碼塊只有一條語句,可以省略花括號{};
程式碼塊裡只有一個語句時,即是需要return,也可以省略return關鍵字(僅僅是關鍵字),
需要返回值時自動返回這條省略了return的語句的值。

4、限制:

1、Lambda表示式的型別必須是函式式介面(不是的話可以強制型別轉換,但與目標型別的唯一抽象方法要有相同的形參列表);

2、Lambda表示式只能為函式式介面建立物件;

函式式介面典型例子:
XxxFunction\XxxConsumer\Predicate\XxxSupplier

3、java8為函式式介面提供了@FunctionalInterface註解,放在介面定義前面,告訴編譯器對該介面進行檢查是否為函式式介面。

public class Demo01 {
    //建立Runnable物件,Runnable是一個函式式介面
    public static void main(String[] args) {
        Runnable r = ()-> System.out.println("Runnable");
        Runnable r1 = () -> {
            for (int i = 0; i < 2; i++) {
                System.out.println(i);
            }
		};

5、補充

方法引用和構造器引用簡化寫法
條件:如果程式碼塊只有一條語句時,還可以進一步簡化lambda寫法。

1.引用類方法
格式: 類名::方法
說明: 介面中被實現方法的全部引數 傳給該類方法作引數。

2.引用特定物件的例項方法
格式: 特定物件::例項方法
說明: 介面中被實現方法的全部引數 傳給該類方法作引數。

3.引用某類物件的例項方法
格式: 類名::例項方法
說明: 介面中被實現方法的第一個引數作為呼叫者,剩餘引數作為該方法的引數

4.引用構造器
格式: 類名::new
說明: 介面中被實現方法的全部引數 傳給該構造器作引數。

//定義一個函式式介面
@FunctionalInterface
interface Demo02 {
    //只有一個抽象方法convert()
    Integer convert(String from);
}
@FunctionalInterface
interface Demo021{
    String test(String a,int b,int c);
}
@FunctionalInterface
interface  Demo022{
    JFrame win(String title);
}
class Demo03{
    public static void main(String[] args) {
        //呼叫Integer類的valueOf方法
        Demo02 obj1 = Integer::valueOf;
        //呼叫"99"物件的indexOf()例項方法實現
        Demo02 obj2 = "99"::indexOf;
        //被實現方法的第一個引數作為呼叫者
        //後面全部引數傳給該方法作引數
        Demo021 obj3 = String::substring;
        //構造器引用
        Demo022 obj4 = JFrame::new;
    }
}

6、區別

lambda表示式與匿名內部類的區別:

lambda表示式是匿名內部類的一種簡化,

  • 相同點:
    1、都可以直接訪問effectively final區域性變數以及外部類的成員變數(包括例項變數和類變數);
    2、二者建立的物件都可以直接呼叫從介面中繼承的預設方法。

  • 不同點:
    1、匿名內部類可為任意介面建立例項,無論有多少抽象方法,lambda只能為函式式介面建立例項。
    2、匿名內部類可以為抽象類或普通類建立例項,後者只能為函式式介面建立例項。
    3、匿名內部類實現的抽象方法的方法體允許呼叫介面定義的預設方法,lambda表示式的程式碼塊不允許呼叫介面定義的預設方法。


下期介紹File類和IO流。