什麼是Lambda表達式,簡單的說是一種匿名函數表達方式。所以Lambda表達式本質是個函數,只不過沒有函數名稱。java
Lambda表達式具備如下特色:ide
Lambda的基本語法是:函數
(參數列表) -> 表達式
學習
或this
(參數列表) -> { 表達式; }
code
有函數式接口的地方就可使用Lambda表達式。接口
函數式接口的定義:一個接口裏面只有一個抽象方法。
字符串
拿Runnable接口來講,它是一個函數式接口,Runnable用法以下代碼所示:get
Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("run..."); } }); thread.start(); Thread.sleep(100);
因爲Runnable是個函數式接口,所以可使用Lambda表示替換,替換後以下:it
// 方式2 Thread thread2 = new Thread(() -> System.out.println("run2...")); thread2.start(); Thread.sleep(100);
這裏的Lambda表達式內容即爲:() -> System.out.println("run2...")
,其中沒有參數,沒有返回值,只有一個方法體。這個表達式一樣能夠寫成:
Thread thread2 = new Thread(() -> { System.out.println("run2..."); // 注意這裏;結尾 });
注意:加了花括號,方法體內部語句必需要有;結尾
還有一個函數式接口Callable,其內部的call方法須要返回一個值,Callable的使用方式以下代碼所示:
ExecutorService excutorService = Executors.newSingleThreadExecutor(); Future<String> future = excutorService.submit(new Callable<String>() { @Override public String call() throws Exception { return "Jim"; } }); String name = future.get(); System.out.println(name);
使用Lambda表達式:
ExecutorService excutorService = Executors.newSingleThreadExecutor(); Future<String> future = excutorService.submit(() -> "Jim2"); String name = future.get(); System.out.println(name);
這裏() -> "Jim2"
表示直接返回一個Jim2字符串,能夠省略return
關鍵字。固然也能夠寫成:
excutorService.submit(() -> { return "Jim2"; });
下面咱們自定義一個函數式接口,而後使用Lambda表達式來書寫。
package learn.java8.ch2; // 函數式接口 @FunctionalInterface interface Caller { String call(String name); } class Serivce { private String name; public Serivce(String name) { this.name = name; } public String run(Caller caller) { return caller.call(name); } } public class LambdaTest2 { public static void main(String[] args) { Serivce service = new Serivce("Jim"); String result = service.run((name) -> { return "My name is " + name; }); System.out.println(result); } }
此時Lambda表達式爲:
(name) -> { return "My name is " + name; }
它具備參數列表、方法體、返回結果組成
注意:name實際類型被省略了,能夠加上:
String result = service.run((String name) -> { return "My name is " + name; });
若是有多個參數,則寫成:
(String a, String b) -> {}
或 (a, b) -> {}
Lambda表達式還能夠當作變量進行存儲,以下代碼所示:
package learn.java8.ch2; import java.util.function.Consumer; public class LambdaTest3 { static Consumer<String> consumer = (name) -> { System.out.println("My name is " + name); }; static class Service { private String name; public Service(String name) { super(); this.name = name; } public void run(Consumer<String> consumer) { consumer.accept(name); } } public static void main(String[] args) { // 能夠直接調用 consumer.accept("Jim"); new Service("Tom").run(consumer); } }
在這個例子中直接使用Lambda表達式定義了一個接口實現:
static Consumer<String> consumer = (name) -> { System.out.println("My name is " + name); };
能夠理解爲將Lambda表達式賦給了consumer變量當中,也能夠理解爲直接實現了Consumer接口中的方法。
總之,只要有函數式接口的地方均可以使用Lambda表達式。
本篇主要介紹了Lambda表達式的基本用法,以及在函數式接口中的使用方式。
按期分享技術乾貨,一塊兒學習,一塊兒進步!