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

一分鐘掌握 Java 8 Lambda 表達式核心原理

     編輯:Java 程式設計入門

從匿名內部類到 Lambda

Java 8 前,排序列表需寫匿名內部類實作 Comparator:

// 傳統寫法
list.sort(new Comparator() {
    @Override
    public int compare(User u1, User u2) {
        return Integer.compare(u1.getAge(), u2.getAge());
    }
});

Lambda 簡化版

// Lambda 寫法
list.sort((u1, u2) -> Integer.compare(u1.getAge(), u2.getAge()));

// 更簡潔:方法引用
list.sort(Comparator.comparingInt(User::getAge));

核心原理:Functional Interface

@FunctionalInterface 標註的介面有且僅有一個抽象方法(SAM)。Comparator、Runnable、Consumer、Function 等皆為函數式介面。

@FunctionalInterface
public interface Comparator {
    int compare(T o1, T o2); // 唯一抽象方法
    // 其他 default / static 方法不影響資格
}

Lambda 到底是什麼?

  • 語法糖:編譯器將 Lambda 轉換為實作該函數式介面的匿名類實例(透過 invokedynamic 指令)。
  • 結構:(參數) -> { 方法體 }。
  • 型別推論:編譯器根據上下文推斷參數型別與返回型別。

變數捕獲規則

  • Lambda 只能捕獲 final 或 effectively final 的區域變數(不可重新賦值)。
  • 實例欄位、靜態欄位無此限制。

常見函數式介面速查

方法引用四種形式

介面抽象方法用途範例
Predicateboolean test(T t)條件判斷list.filter(u -> u.getAge() > 18)
FunctionR apply(T t)轉換map(User::getName)
Consumervoid accept(T t)消費/副作用forEach(System.out::println)
SupplierT get()供給/延遲初始化() -> new User()
Comparatorint compare(T o1, T o2)排序sort((a,b) -> a - b)
類型語法等價 Lambda
靜態方法Class::staticMethod(args) -> Class.staticMethod(args)
實例方法(特定物件)obj::method(args) -> obj.method(args)
實例方法(任意物件)Class::method(obj, args) -> obj.method(args)
建構子Class::new(args) -> new Class(args)

總結

Lambda 讓 Java 擁有函數式編程能力,核心是 函數式介面 + 型別推論 + 語法糖。善用 Stream API、方法引用、標準函數式介面,能寫出更宣告式、可讀、可並行的現代化 Java 代碼。

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