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

Java 8 函數式介面 @FunctionalInterface:為 Lambda 表達式而生的陳舊新瓶

     編輯:關於C++

Java 8 函數式介面完整解析

單一抽象方法介面(SAM)在 Java 8 重新命名為函數式介面,專為 Lambda 表達式服務。Runnable, Comparator, Callable 皆為經典例子。

從匿名內部類到 Lambda

// Java 7 匿名內部類
new Thread(new Runnable() {
    @Override public void run() { System.out.println("Anonymous"); }
}).start();

// Java 8 Lambda
new Thread(() -> System.out.println("Lambda")).start();

@FunctionalInterface 註解

編譯時驗證:介面必須僅有一個抽象方法,否則報錯。

@FunctionalInterface
interface MyFunc {
    void doSomething();
    // void another(); // 編譯錯誤:多於一個抽象方法
}

default 方法:介面演進的關鍵

Java 8 允許介面定義預設實現,解決介面擴展破壞現有實現類的問題:

@FunctionalInterface
interface MyFunc {
    void doSomething();
    default void another() { System.out.println("Default impl"); }
}
// 現在合法:only one abstract method

函數式介面分類(java.util.function)

介面參數返回用途
Predicate<T>Tboolean條件判斷
Consumer<T>Tvoid消費操作
Function<T,R>TR轉換操作
Supplier<T>無T供給操作
UnaryOperator<T>TT一元運算
BinaryOperator<T>T, TT二元運算

最佳實務建議

  1. 自定義函數式介面加 @FunctionalInterface — 文檔化並獲編譯器保護
  2. 優先用標準庫 java.util.function 介面 — 通用、可組合
  3. default 方法慎用:介面預設實現模糊了介面/抽象類界限,設計時傾向抽象類
  4. 方法引用:System.out::println 替代 x -> System.out.println(x)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved