JDK8新特性——lambda表達式

package zcl.jdk8.lambda;

/**
 * 使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
 * 參考學習文檔:https://www.runoob.com/java/java8-lambda-expressions.html
 */
public class TestMain4Lambda {

    /*
     一、lambda的標準格式爲:

    (Object obj)-> {
        doSomeThing();
        return result;
    }

    二、爲了簡化語法,lambda可以省略一些語句,省略規則爲:
     a. 小括號中的參數類型可以省略。
     b. 如果小括號中只有一個參數,那麼可以省略 小括號。
     c. 如果大括號中只有一條語句,那麼可以省略 大括號、return、分號

     三、lambda的使用前提:
     a. 必須有接口(不能是抽象類),接口中有且僅有一個需要被重寫的抽象方法。
     b. 必須支持上下文推導,要能夠推導出來 Lambda 表達式表示的是哪個接口中的內容。

     四、使用場景:
     a. 可以使用接口當做參數,然後傳遞 Lambda 表達式(常用)
     b. 可以將 Lambda 表達式賦值給一個接口類型的變量
     **/

    public static void main(String[] args) {
        /*
          使用場景a示例:可以使用接口當做參數,然後傳遞 Lambda 表達式(常用)
         */
        SceneA sceneA = new SceneA();
        sceneA.setName("Johny");
        sceneA.setId(123);
        //jdk7
        sceneA.getInfo(new ILambdaTest() {
            @Override
            public Object test(String name, Integer id) {
                return name+"," +id;
            }
        });

        // jdk8標準寫法
        sceneA.getInfo((String name, Integer id) -> {
            return name+"," +id;
        });

        // jdk8簡化寫法
        sceneA.getInfo((name, id)-> name+"," +id);

        // 常見案例
        new Thread(() -> System.out.println("線程啓動了")).start();

        /*
          使用場景b示例:可以將 Lambda 表達式賦值給一個接口類型的變量
         */

        // 標準寫法
        ILambdaTest getInfo = (String name, Integer id) -> {
            return name+"," +id;
        };

        // 簡化寫法
        ILambdaTest getInfoSimple = (name, id)-> name+"," +id;

        System.out.println(getInfo.test("viga", 456));
        System.out.println(getInfoSimple.test("viga", 456));
    }

}
package zcl.jdk8.lambda;

public interface ILambdaTest {

    // 不能是抽象類,必須是接口,有且僅有一個抽象方法
    Object test(String name, Integer id);
}
package zcl.jdk8.lambda;

import lombok.Data;

@Data
public class SceneA {

    private String name;

    private Integer id;

    public Object getInfo(ILambdaTest iLambdaTest){
        System.out.println("info-" + name + "," + id);
        return iLambdaTest.test(name, id);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章