lambda 學習

lambda

Lambda 是一個匿名函數,我們可以把 Lambda 表達式理解爲是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼。作爲一種更緊湊的代碼風格,使Java的語言表達能力得到了提升。

lambda 語法格式

(parameters) -> expression 或者 (parameters) -> {statements;}

lambda區分好左右各是什麼。左邊:參數,右邊:表達式。

注意事項:

  • 如果參數只有一個,可以不加圓括號
  • 不需要聲明參數類型,因爲可以類型推斷
  • 如果只有一條語句,可以不加花括號
  • 如果只有一條語句,編譯器會自動將值返回;如果多條的話,需要手動return

lambda 所需支持

Lambda 表達式需要“函數式接口”的支持 ,

函數式接口

接口中只有一個抽象方法的接口,稱爲函數式接口。 可以使用註解 @FunctionalInterface 修飾 (可以檢查是否是函數式接口,如果不是函數式接口則會編譯不通過)

代碼案例

package cn.alistarfeng.demo.lambda;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @Auther: alistarfeng
 * @Date: 2019/9/12 15:51
 * @Description: lambda  學習 (parameters) -> expression 或者 (parameters) -> {statements;}
 */
public class LambdaDemo {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 語法格式1 : 無參數,無返回值
     */
    @Test
    public void test1() {
        //原來的方式
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                logger.info("hello world");
            }
        };
        runnable.run();
        //lambda
        Runnable runnable1 = () -> logger.info("hello world 2");
        runnable1.run();
    }

    /**
     * 語法格式二 :有一個參數,並且無返回值,(只有一個參數可省略括號)
     */
    @Test
    public void test2() {
        //原來的方式
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String s) {
                logger.info(s);
            }
        };
        consumer.accept("hope");
        //lambda的方式
        Consumer<String> consumer1 = (str) -> logger.info(str);
        consumer1.accept("hope1");
        Consumer<String> consumer2 = str -> logger.info(str);
        consumer2.accept("hope2");
    }

    /**
     * 語法格式三:有兩個以上的參數,有返回值,並且 Lambda 體中有多條語句(需要使用花括號括起來 , 且有返回的值的時候必須加return)
     */
    @Test
    public void test3() {
        //原來的方式
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                logger.info("匿名內部類輸出");
                return o1 - o2;
            }
        };
        logger.info("comparator: {}", comparator.compare(4, 3));

        //lambda
        Comparator<Integer> comparator2 = (x, y) -> {
            logger.info("Lambda輸出");
            return x - y;
        };
        logger.info("comparator2: {}", comparator2.compare(4, 3));
    }

    /**
     * 語法格式四:若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫
     */
    @Test
    public void test4(){
        //原來使用匿名內部類
        Comparator<Integer> com = new Comparator<Integer>() {
            @Override
            public int compare(Integer x, Integer y) {
                return Integer.compare(x, y);
            }
        };
        logger.info("comparator: {}", com.compare(4, 3));

        //Lambda 表達式
        Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
        logger.info("comparator2: {}", com.compare(4, 3));
    }

    
}

代碼地址:https://github.com/alistarfeng/java-learning/tree/master/java8-demo

歡迎關注 alistarfeng

在這裏插入圖片

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