在 Java 中,Lambda 表達式(也稱為匿名方法)是一種簡潔的表示方法接口(Functional Interface)實現的方式。它是 Java 8 引入的特性,目的是提高代碼的簡潔性和可讀性。
Lambda 表達式的語法:
Lambda 表達式的基本語法結構如下:
(parameters) -> expression
- parameters: 輸入參數,類型可以省略,編譯器會根據上下文推斷。
- ->: Lambda 表達式的箭頭符號,用于分隔參數和方法體。
- expression: 方法體,方法體可以是一個簡單的表達式或者是一個代碼塊。
Lambda 表達式的主要特征:
- 簡化代碼:使代碼更加簡潔。
- 支持函數式編程:Lambda 表達式使得 Java 可以實現函數式編程。
- 支持傳遞行為:Lambda 讓代碼行為可以作為參數傳遞。
Lambda 表達式的基本用法
Lambda 表達式通常用于實現 Java 中的 函數式接口(Functional Interface)。函數式接口是只包含一個抽象方法的接口,例如:Runnable
、Comparator
、Callable
等。
示例 1: 使用 Lambda 表達式替代匿名內部類
我們首先看一個使用匿名內部類的代碼示例,然后用 Lambda 表達式進行簡化。
1.1. 匿名內部類示例:
假設我們有一個 Runnable
接口的實例,用來創建一個線程。
public class LambdaExample {public static void main(String[] args) {// 使用匿名內部類實現Runnable接口Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Hello from the thread!");}};// 創建線程并啟動Thread thread = new Thread(runnable);thread.start();}
}
1.2. 使用 Lambda 表達式簡化:
Lambda 表達式可以將上述匿名內部類簡化為更簡潔的形式:
public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表達式簡化Runnable runnable = () -> System.out.println("Hello from the thread!");// 創建線程并啟動Thread thread = new Thread(runnable);thread.start();}
}
在這個例子中,Lambda 表達式 () -> System.out.println("Hello from the thread!")
替代了匿名內部類。
示例 2: 使用 Lambda 表達式處理集合(List)
Java 8 引入了流(Stream)API,可以非常方便地對集合進行操作。我們可以使用 Lambda 表達式和流 API 對集合進行過濾、排序和遍歷等操作。
2.1. 傳統方式:使用 for
循環遍歷集合
import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 使用傳統的 for 循環遍歷集合for (String name : names) {System.out.println(name);}}
}
2.2. 使用 Lambda 表達式與 Stream API 遍歷集合
使用 Lambda 表達式和 forEach
方法來遍歷集合:
import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 使用 Lambda 表達式與 forEach 遍歷集合names.forEach(name -> System.out.println(name));}
}
forEach
是 Stream
接口的一個方法,可以接受一個 Consumer
類型的參數,而 Consumer
接口只有一個方法 accept
,所以我們可以傳入 Lambda 表達式來替代匿名內部類。
示例 3: 使用 Lambda 表達式進行排序
Lambda 表達式可以用來簡化比較器的實現。
3.1. 使用匿名內部類排序:
import java.util.Arrays;
import java.util.Comparator;public class LambdaExample {public static void main(String[] args) {String[] names = {"Alice", "Bob", "Charlie", "David"};// 使用匿名內部類排序Arrays.sort(names, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});System.out.println(Arrays.toString(names));}
}
3.2. 使用 Lambda 表達式排序:
import java.util.Arrays;public class LambdaExample {public static void main(String[] args) {String[] names = {"Alice", "Bob", "Charlie", "David"};// 使用 Lambda 表達式排序Arrays.sort(names, (o1, o2) -> o1.compareTo(o2));System.out.println(Arrays.toString(names));}
}
示例 4: 函數式接口的使用
Java 8 引入了大量的函數式接口(例如 Predicate
, Function
, Consumer
, Supplier
等)。我們可以通過 Lambda 表達式來實現這些接口。
4.1. 使用 Lambda 表達式實現 Predicate
接口
Predicate
接口用于判斷某個條件是否成立,它有一個抽象方法 test
。
import java.util.function.Predicate;public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表達式創建 Predicate 接口實例Predicate<Integer> isEven = num -> num % 2 == 0;System.out.println(isEven.test(4)); // trueSystem.out.println(isEven.test(5)); // false}
}
4.2. 使用 Lambda 表達式實現 Function
接口
Function
接口用于將輸入參數轉換為輸出結果,它有一個抽象方法 apply
。
import java.util.function.Function;public class LambdaExample {public static void main(String[] args) {// 使用 Lambda 表達式創建 Function 接口實例Function<Integer, Integer> square = num -> num * num;System.out.println(square.apply(4)); // 16System.out.println(square.apply(5)); // 25}
}
小結:
- Lambda 表達式使代碼更加簡潔。
- 適用于實現 函數式接口,即只有一個抽象方法的接口。
- Lambda 表達式可以替代匿名內部類,使得代碼更加簡潔易懂。
- Java 8 的 Stream API 與 Lambda 表達式結合,可以非常方便地處理集合。
通過這些示例,你可以看到如何在 Java 中使用 Lambda 表達式提高代碼的簡潔性和可讀性。