天天看點

【java函數式程式設計02】lambda表達式與雙冒号

java lambda表達式

0 總結在前面:

  1. lambda表達式是java函數式程式設計範式的一個表現形式,将單方法類或接口的實作,直接看成一個可直接定義的函數方法,以更緊湊簡潔形式,提高可讀性,減少代碼量;
  2. Lambda表達式允許您更緊湊地表達單方法類的執行個體。(這是官方文檔的翻譯說明);
  3. 雙冒号作用:當lambda表達式内部的實作是單方法類且與實作接口入參形式相同,使用雙冒号:【類名(類執行個體名) :: 方法名】,可以進一步簡化相關表達;

1 什麼是Lambda表達式?

Lambda 表達式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。

Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。

Lambda表達式使您可以執行此操作,将功能視為方法參數,或将代碼視為資料。
Lambda expressions let you express instances of single-method classes more compactly. Lambda表達式允許您更緊湊地表達單方法類的執行個體。

2why?

  • 提高可讀性;
  • 減少代碼量,更加簡潔節湊;

3 文法?

  • A comma-separated list of formal parameters enclosed in parentheses.一個圓括号内以逗号分離的參數清單;
  • The arrow token,

    ->

    箭頭标記
  • A body, which consists of a single expression or a statement block.一個主體,由單個表達式或語句塊組成。
  • 如果指定單個表達式,則Java運作時将計算表達式,然後傳回其值。或者,您可以使用return語句。
  • 如果lambda表達式的目标類型及其捕獲的參數是可序列化的,則可以序列化它。但是,與内部類一樣,強烈建議不要對lambda表達式進行序列化。

4 how?

package consumer;
public class Java8LambdaTest {
    public static void main(String args[]){
        Java8LambdaTest tester = new Java8LambdaTest();
        MathOperation multiplicationAndAddx = (x, y) -> {return x * y + x;};

        // 類型聲明
        MathOperation addition = (int a, int b) -> a + b;

        // 不用類型聲明
        MathOperation subtraction = (a, b) -> a - b;

        // 大括号中的傳回語句
        MathOperation multiplication = (int a, int b) -> { return a * b; };

        // 沒有大括号及傳回語句
        MathOperation division = (int a, int b) -> a / b;

        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));
        System.out.println("10 * 5 + 10 = " + tester.operate(10, 5, multiplicationAndAddx));


        // 不用括号
        GreetingService greetService1 = message ->
                System.out.println("Hello " + message);

        // 用括号
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);

        greetService1.sayMessage("Runoob");
        greetService2.sayMessage("Google");
    }

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
}
           

5 總結

  1. callable和runnable的lambda接口由于隻有一個方法,即run和call,都不含有入參,所有lambada 表達式也沒有入參,除非自己定義入參,但是call支援傳回,也是其特性;
  2. lambda表達式适用于單方法類,也就是單方法接口實作;

6 雙冒号作用:

雙冒号是lambda表達式的一種簡化形式,當lambda表達式實作函數與其他靜态類或者實作類的方法有相同個數或形式入參的時候,可以簡化表達,使用

類名(類執行個體名) :: 方法名

可以簡化表達式;相當于對這個方法閉包的引用;