MO_or關於Lambda表達式的學習

lambda.jpeg

1、引言

本文將探討 JDK 1.8 中引入的新特性 Lambda (λ) 表達式
主要解決以下幾個問題:html

  1. 什麼是函數式接口?
  2. 函數式接口的做用是什麼?
  3. 什麼是 Lambda 表達式?
  4. Lambda 表達式的做用是什麼?
  5. Lambda 表達式的演化過程
  6. Lambda 表達式的簡化過程

2、什麼是函數式接口

接口的方法默認是public abstract,都是抽象方法,而函數式接口則有且僅有一個抽象方法,但能夠有多個非抽象方法,一般用註解進行標識java

@FunctionalInterface

這裏列舉一些JDK 1.8之前經常使用的函數式接口:編程

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.util.Comparator
  • java.io.FileFilter
  • java.awt.event.ActionListener

在JDK 1.8中新增了以下函數式接口:api

  • Consumer(相似於消費者須要傳入參數無返回值)
  • Supplier(相似於生產者不須要傳入參數,但有返回值)
  • Function(有輸入也有返回)
  • Predicate(判斷函數,有輸入也有返回,返回true or false

3、函數式接口的做用是什麼?

由於Java是面向對象的,方法間參數傳遞須要爲對象,而不能是方法,若想向方法傳遞方法,則須要一個只有一個抽象方法的接口實現類的對象,將這個對象傳到方法中就實現了向方法傳遞方法。
總結:函數式接口即是爲了解決向方法傳遞方法的需求,將須要傳遞的方法轉爲一個函數式接口對象(有且僅有一個抽象方法的接口實現類),以此來解決向方法傳遞方法的需求。數據結構

3.1 進一步再思考一個問題 「爲何要向方法傳遞方法?」

筆者是這樣認爲的,大部分問題實際是圍繞時間和空間的問題,就像不一樣的數據結構是在作時間和空間上的取捨,是爲了節約更多空間,而犧牲一點時間,或者是爲了節約更多時間,而佔用更多空間。
用相同的思考模式去看編程語言的升級其實也是這樣的,是爲了下降編程難度,使代碼更易懂更易用,這樣就能夠節約更多的時間去作別的,而不是花費過多時間去編碼。
而上面的問題其實也是爲了讓代碼更易懂更易用,至於怎麼體現出更易懂更易用的,讀者能夠獨自思考思考。多線程

4、什麼是 Lambda 表達式?

Lambda表達式能夠將函數做爲一個方法的參數oracle

5、Lambda 表達式的做用是什麼?

  1. 避免匿名內部類定義過多
  2. 讓代碼更簡潔,更易讀
  3. 去掉過多冗餘、修飾性的代碼,只保留核心邏輯

這就就比如語法糖,能讓代碼更好寫也更好讀。但筆者也知道,任何新的東西引入必然帶來新的混亂,學習新的知識須要過程,適應也須要過程,但其最終的回報筆者認爲是值得的。編程語言

6、Lambda 表達式的演化、簡化過程

// 方式1、函數式接口
@FunctionalInterface
interface ILike {

    // 接口中的訪問修飾符、abstract修飾符是能夠省略的
    // 由於接口中默認就是抽象方法,又由於接口是須要實現類來實現其中方法的
    // 因此訪問修飾符默認是public
    void lambda();

}

// 方式1、實現函數式接口中的抽象方法
class Like implements ILike {

    @Override
    public void lambda() {
        System.out.println("Lambda 1");
    }
}

public class TestLambda {

    // 方式二:靜態內部類
    static class Like1 implements ILike {

        @Override
        public void lambda() {
            System.out.println("Lambda 2");
        }
    }

    public static void main(String[] args) {

        // 方式一:函數式接口
        ILike like = new Like();
        like.lambda();

        // 方式二:靜態內部類
        like = new Like1();
        like.lambda();

        // 方式三:局部內部類
        class Like2 implements ILike {

            @Override
            public void lambda() {
                System.out.println("Lamdba 3");
            }
        }
        like = new Like2();
        like.lambda();

        // 方式四:匿名內部類,沒有類的名稱,必須藉助接口或父類
        like = new ILike() {
            @Override
            public void lambda() {
                System.out.println("Lamdba 4");
            }
        };
        like.lambda();

        // 方式五:Lamdba表達式,只保留具體的方法
        // 前提是必須爲函數式接口
        like = () -> {
            System.out.println("Lambda 5");
        };
        like.lambda();

    }

}

7、參考

8、最後

如有不足,敬請指正
虛心若愚,求知若渴ide

相關文章
相關標籤/搜索