介紹Lambda

介紹Lambda

本文介紹Lambda,Lambda是一種函數式編程的寫法,java8的新特性,是一種花裏胡哨的寫法,如果你能夠熟練使用的話,將會讓別人看的眼花繚亂,目瞪口呆,熟練使用Lambda能夠讓你看起來更像一位大神。

轉自:

https://mp.weixin.qq.com/s/H4_wkiEtfp33iwevDItyKw

一.Lambda用法
格式如下:
在這裏插入圖片描述
普通創建線程的代碼:

public static void main(String[] args) {
    // 用匿名內部類的方式來創建線程
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("公衆號:Java3y---關注我!");
        }
    });

    // 使用Lambda來創建線程
    new Thread(() -> System.out.println("公衆號:Java3y---關注我!"));
}

Lambda創建線程:
在這裏插入圖片描述
使用方法如圖所示:
在這裏插入圖片描述
使用Labmda表達式需要函數式編程接口,比如在Runnable接口上我們可以看到@FunctionalInterface註解(標記着這個接口只有一個抽象方法)
在這裏插入圖片描述
1.1函數式編程接口:
在這裏插入圖片描述
簡單說明一下:

表格中的一元接口表示只有一個入參,二元接口表示有兩個入參
在這裏插入圖片描述
java提供的常用接口:
在這裏插入圖片描述
Demo:

// Consumer 一個入參,無返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");

// Supplier 無入參,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);

//.....

使用Lambda時,要記住的就兩點:

  1. Lambda返回的是接口的實例對象
  2. 有沒有參數、參數有多少個、需不需要有返回值、返回值的類型是什麼---->選擇自己合適的函數式接口

1.2方法引用
在學Lambda的時候,還可能會發現一種比較奇怪的寫法,例如下面的代碼:

// 方法引用寫法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");

如果按正常Lambda的寫法可能是這樣的:

// 普通的Lambda寫法
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Java3y");

顯然使用方法引用比普通的Lambda表達式又簡潔了一些。

如果函數式接口的實現恰好可以通過調用一個方法來實現,那麼我們可以使用方法引用
在這裏插入圖片描述
函數式接口的實現恰好可以通過調用一個方法來實現

方法引用又分了幾種:

  • 靜態方法的方法引用
  • 非靜態方法的方法引用
  • 構造函數的方法引用

方法引用Demo:

public class Demo {
    public static void main(String[] args) {
        // 靜態方法引用--通過類名調用
        Consumer<String> consumerStatic = Java3y::MyNameStatic;
        consumerStatic.accept("3y---static");

        //實例方法引用--通過實例調用
        Java3y java3y = new Java3y();
        Consumer<String> consumer = java3y::myName;
        consumer.accept("3y---instance");

        // 構造方法方法引用--無參數
        Supplier<Java3y> supplier = Java3y::new;
        System.out.println(supplier.get());
    }
}

class Java3y {
    // 靜態方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 實例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 無參構造方法
    public Java3y() {
    }
}

結果如下:
在這裏插入圖片描述
最後
Lambda雖然代碼看起來是簡潔,但是如果複雜的話還是比較難看明白的。

在學習Lambda的時候,首先我們得知道有哪些常用函數式編程接口,這些函數式編程接口的有什麼區別(參數個數、返回值類型)

Lambda表達式返回的是接口對象實例,如果函數式接口的實現恰好可以通過調用一個方法來實現,那麼我們可以使用方法引用來替代Lambda表達式

最後再完整舉個例子:

// Supplier是一個無入參帶返回的值的函數式編程接口

// () -> new Java3y()這整句Lambda表達式,返回的是Supplier接口的實例。從Lambda表達式可以看出無參數,帶返回值
Supplier<Java3y> supplier = () -> new Java3y(); 

// 由於這個“() -> new Java3y()”Lambda表達式可以通過調用一個方法就實現了,那麼我們可以優化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章