2014/03/18

Java 8 Lambdas

Java SE 8 Lambda 表達式入門指南

Java SE 8 引入了 Lambda 表達式,讓 Java 程式碼更簡潔、直觀,特別是在集合操作和函數式編程中發揮重要作用。本文將介紹 Lambda 表達式的基本語法、應用場景及實作範例。


1. Lambda 表達式的基本語法

Lambda 表達式的基本語法如下:

(parameters) -> expression
// 或
(parameters) -> { statements; }
  • parameters:參數列表,可以省略類型聲明,當只有一個參數時,括號也可省略。
  • ->:Lambda 運算符,表示參數與方法體的關係。
  • expression{ statements; }:方法體,若是單一表達式則可省略 {}

範例:

// 無參數,回傳固定值
() -> 42;

// 單個參數,回傳其平方值
x -> x * x;

// 多個參數,回傳其加總值
(x, y) -> x + y;

// 帶有類型的參數
(int x, int y) -> x * y;

// 使用代碼區塊
(x, y) -> {
    int sum = x + y;
    return sum * 2;
};

2. Lambda 表達式的應用場景

Lambda 表達式最常用於:

2.1 Java 內建函數式介面

Java 8 引入了一些常見的函數式介面,可與 Lambda 表達式配合使用:

介面 方法 作用
Predicate<T> boolean test(T t) 測試條件,回傳 true/false
Function<T, R> R apply(T t) 轉換 T 類型數據為 R
Consumer<T> void accept(T t) 接收 T 類型數據執行操作
Supplier<T> T get() 提供 T 類型數據

示例

import java.util.function.Predicate;

public class LambdaExample {
    public static void main(String[] args) {
        Predicate<String> isLongerThanFive = s -> s.length() > 5;
        System.out.println(isLongerThanFive.test("Hello"));  // false
        System.out.println(isLongerThanFive.test("Lambda")); // true
    }
}

2.2 在集合 (Collections) 中的應用

Lambda 可用於 List 操作,例如過濾、排序、映射 (mapping) 等。

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class LambdaCollection {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Amanda", "Charlie");

        // 過濾以 "A" 開頭的名字
        List<String> filteredNames = names.stream()
                                          .filter(name -> name.startsWith("A"))
                                          .collect(Collectors.toList());

        System.out.println(filteredNames); // [Alice, Amanda]
    }
}

3. Lambda 與方法參考 (Method Reference)

當 Lambda 只是一個簡單的方法調用時,可以使用方法參考來簡化程式碼。

3.1 靜態方法參考

import java.util.Arrays;
import java.util.List;

public class MethodReference {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.forEach(System.out::println); // 使用方法參考
    }
}

等同於:

names.forEach(name -> System.out.println(name));

3.2 物件實例方法參考

public class StringUtils {
    public void print(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        StringUtils utils = new StringUtils();
        List<String> words = Arrays.asList("Java", "Lambda", "Stream");
        words.forEach(utils::print);
    }
}

4. Lambda 在執行緒 (Thread) 中的應用

Java 8 之前的匿名內部類:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("執行緒開始運行");
    }
}).start();

Lambda 簡化後的寫法:

new Thread(() -> System.out.println("執行緒開始運行")).start();

5. 結論

Lambda 表達式讓 Java 變得更加簡潔且易於閱讀,尤其是在處理集合、函數式編程和多執行緒操作時。透過 Java 內建的 函數式介面,我們可以更高效地編寫程式,提高開發效率。

希望這篇文章能幫助你更好地理解 Java 8 的 Lambda 表達式!


參考連結: