Lambda 表達式是 Java 8 引入的一種簡潔的表示匿名方法的方式,使用它可以用于替代某些匿名內部類對象,從而讓程序更簡潔,可讀性更好。但 Lambda 表達式的底層是如何實現的呢?接下來我們一起來看。
未使用 Lambda 表達式之前,我們創建一個線程,可以這樣寫:
Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); }});t1.start();
其中 Runnable 匿名內部類,查看 Runnable 源碼,我們可以看到 Runnable 的實現如下:
匿名內部類是在 Java 中定義的一個沒有名稱的內部類。它通常在一個類的成員位置或者方法體內直接定義,并且立即實例化。
匿名內部類的主要用途在于簡化代碼,避免為了實現一個簡單的功能而定義一個完整的類。它特別適用于只需要一次使用的類,比如實現一個接口的單方法(即函數式接口)的場合。
PS:自從 Java 8 引入 Lambda 表達式后,很多原本使用匿名內部類的地方可以被更簡潔的 Lambda 表達式替代。
上面代碼中的 new Runnable 就是一個標準匿名內部類的使用。
@FunctionalInterface 是 Java 8 引入的一個注解,它用于標記一個接口為函數式接口。
函數式接口是指只包含一個抽象方法的接口。這個注解雖然不是必需的,但它提供了一種明確的方式告訴編譯器和開發者,這個接口是設計為函數式接口的。
@FunctionalInterface 注解的作用如下:
在 Java 標準庫中,有許多使用 @FunctionalInterface 注解的接口,如 java.util.function 包下的 Function、Predicate、Consumer 等,這些接口都是函數式接口,廣泛用于數據處理、過濾、轉換等操作。此外,在 Spring Boot 框架中,也經常使用函數式接口來定義事件監聽器、回調函數等。
未使用 Lambda 表達式之前,我們創建一個線程是這樣寫的:
Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); }});t1.start();
而用了 Lambda 表達式,我們可以這樣寫:
Thread t1 = new Thread(() -> { System.out.println("t1"); });t1.start();
從上述代碼可以看出,當我們使用 Lambda 表達式之后,代碼就變得更簡潔和優雅了。
Lambda 表達式的語法形式如下:
(parameters) -> expression
或者是:
(parameters) -> { statements; }
以上語法含義如下:
Lambda 表達式主要用于執行函數式接口(Function Interface),即只有一個抽象方法的接口。常見的函數式接口包括 java.util.function 包下的 Predicate、Function、Consumer 等。
假設我們有一個List,并且我們想要對這個列表進行過濾操作,只保留偶數元素。使用 Lambda 表達式可以非常方便地實現這一功能:
import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // 使用 Lambda 表達式過濾出偶數 List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); // 輸出 [2, 4, 6, 8] }}
在這個例子中,n -> n % 2 == 0 是一個 Lambda 表達式,它接受一個整數 n 作為輸入參數,并返回一個布爾值。這個 Lambda 表達式被用作 filter 方法的參數,該方法期望一個 Predicate類型的函數式接口實例。
Lambda 底層運行原理如下:
所以,綜合來說,Lambda 表達式其實是匿名內部類的語法糖,這個語法糖在程序執行時會進行兌現,也就是生成匿名內部類并進行任務執行。
本文鏈接:http://www.tebozhan.com/showinfo-26-112795-0.html面試官:說說Lambda表達式底層原理?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 微服務為什么要容器化?