首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 8 Lambda 表達式完整指南:語法、函數式介面、方法引用與實戰模式

     編輯:Java 綜合教學

Java 8 Lambda 表達式完整指南:語法、函數式介面、方法引用與實戰模式

Lambda 表達式是 Java 8 最大新特性(JSR 335),引入函數式程式設計範式,徹底簡化匿名內部類寫法。本文系統梳理語法規則、函數式介面、核心 API 與實戰應用模式。

背景:從匿名內部類到 Lambda

傳統 Swing 事件處理:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Click Detected");
    }
});

痛點:為單一方法編寫大量樣板碼。Lambda 將「行為」作為資料傳遞。

函數式介面

定義:有且僅有一個抽象方法的介面(可含 default/static 方法)。

@FunctionalInterface
public interface ActionListener extends EventListener {
    void actionPerformed(ActionEvent e); // 唯一抽象方法
}

JDK 內建常用函數式介面(java.util.function):

介面方法參數回傳用途
Runnablerun無void無參無回傳動作
Supplier<T>get無T產生值
Consumer<T>acceptTvoid消費值
Function<T,R>applyTR轉換值
Predicate<T>testTboolean條件判斷
Comparator<T>compareT, Tint比較排序

Lambda 語法完整規則

參數列表 -> 表達式主體
(參數) -> { 陳述式塊; return 值; }

四大可選簡化規則

  1. 型別宣告可省略:編譯器推導
    (int a, int b) -> a + b ≡ (a, b) -> a + b
  2. 單參數括號可省略:a -> a * 2(無參/多參需括號:() -> ..., (a,b) -> ...)
  3. 單一表達式花括號與 return 可省略:a -> a * 2(塊需 { return a * 2; })
  4. 隱含回傳:表達式結果自動回傳

完整實戰範例

public class LambdaTest {
    // 自訂函數式介面
    interface MathOperation { int operation(int a, int b); }
    interface GreetingService { void sayMessage(String message); }
    interface Runnable { void run(); }

    public static void main(String[] args) {
        LambdaTest tester = new LambdaTest();

        // 1. 多種寫法實作 MathOperation
        MathOperation add = (int a, int b) -> a + b;                    // 完整型別
        MathOperation sub = (a, b) -> a - b;                            // 省略型別
        MathOperation mul = (int a, int b) -> { return a * b; };        // 區塊+return
        MathOperation div = (int a, int b) -> a / b;                    // 簡潔型

        // 呼叫輔助方法
        System.out.println("10 + 5 = " + tester.operate(10, 5, add));
        System.out.println("10 - 5 = " + tester.operate(10, 5, sub));
        System.out.println("10 * 5 = " + tester.operate(10, 5, mul));
        System.out.println("10 / 5 = " + tester.operate(10, 5, div));

        // 2. GreetingService:單參數括號可省略
        GreetingService greet1 = message -> System.out.println("Hello " + message);
        GreetingService greet2 = (message) -> System.out.println("Hello " + message);
        greet1.sayMessage("Mahesh");
        greet2.sayMessage("Suresh");

        // 3. 無參 Runnable
        Runnable runTest = () -> System.out.println("Running");
        runTest.run();
    }

    private int operate(int a, int b, MathOperation op) {
        return op.operation(a, b);
    }
}

核心應用模式

  1. 集合流式處理:list.stream().filter(...).map(...).collect(...)
  2. 執行緒池提交:executor.submit(() -> doWork())
  3. 比較器簡化:list.sort((a, b) -> a.getName().compareTo(b.getName()))
  4. 回調/事件處理:button.onClick(() -> handleClick())

方法引用

Lambda 只是呼叫現有方法時,可用方法引用更簡潔:

類型語法範例等價 Lambda
靜態方法類別::方法Integer::parseInts -> Integer.parseInt(s)
實例方法實例::方法System.out::printlnx -> System.out.println(x)
任意物件實例方法類別::方法String::length(s) -> s.length()
建構子類別::newArrayList::new() -> new ArrayList()

變數捕獲規則

  • Lambda 只能捕獲 final 或實際上 final(未重新賦值)的區域變數
  • 實例/靜態變數無限制

總結

Lambda 表達式讓 Java 擁有了「函數即公民」的能力:

  1. 消除匿名內部類樣板碼
  2. 支援函數式程式設計風格
  3. 配合 Stream API 實現聲明式資料處理
  4. 方法引用進一步提升程式碼可讀性

掌握 Lambda,是邁向現代 Java 開發(Spring 5+、Reactive Streams、微服務)的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved