多線程併發基礎外傳之lambda表達式

語言: CN / TW / HK

theme: smartblue

1. 寫在前面

為什麼扯到了lambda?其實也是和Runnable接口有關係。其實,Runnable是一個函數式接口,可以用lambda表達式來創建其對象。

2. lambda表達式簡介

總體來説,lambda屬於函數式編程的概念,它可以避免匿名內部類定義過多,也可以簡化代碼

關於函數式編程的概念,對我來説還算模糊,所以不在這裏誤導大家了,那麼函數式接口,是什麼意思呢?其實,函數式接口,就是只包含一個抽象方法的接口。兩個重點,“一個”還有“抽象”。

那麼,對於函數式接口,我們就可以使用lambda表達式來創建該接口的對象

3. 看個例子吧

其實在這裏,最經典的例子,還是Runnable接口。我們可以看下Runnable接口的定義

image.png 在這個接口裏面,只有一個抽象方法run,所以Runnable接口就是一個函數式接口。那麼我們怎麼通過lambda表達式進行簡化呢

不用lambda表達式,怎麼創建線程(匿名內部類)

java Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("我是線程"); } });

用lambda表達式,怎麼創建線程

java Thread thread = new Thread(() -> System.out.println("我是線程")); thread.start();

我們發現,直接用一對括號表示參數,加個箭頭,指向函數體,就可以不用寫一個匿名內部類了。

4. 還不懂?沒關係,我們再看個例子

首先我們定義一個函數式接口。

java interface MyInterface { public abstract void doSomething(int a); }

用匿名內部類創建其對象

java MyInterface myInterface = new MyInterface() { @Override public void doSomething(int a) { System.out.println("做點啥吧"); } }; myInterface.doSomething(1);

用lambda表達式創建其對象

java MyInterface myInterface = (int a) -> System.out.println("做點啥吧"); myInterface.doSomething(1); 其實這裏的lambda表達式還可以簡化,並且當函數體不只是一行代碼的時候,花括號也不可省略了。但細節的就不再多介紹了,畢竟,這裏只是一個入門文章,只要懂了lambda表達式怎麼來的,以及它的定義,那這篇文章就實現它的價值了。

5. 總結一下

Runnable是一個函數式接口,在創建對象時可以用lambda表達式簡化,lambda表達式既可以避免匿名內部類定義過多,也可以用來簡化代碼。