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

Java 函數式編程:將函數作為參數傳遞的演進與實戰

     編輯:程式設計綜合問答

Java 8 前:介面 + 匿名內部類

// 定義函數型介面
interface MathFunc { double apply(double x); }

// 使用
void compute(MathFunc f) {
    for (int k = 1; k <= 10; k++) System.out.println(f.apply(k));
}

// 呼叫
compute(new MathFunc() {
    public double apply(double x) { return Math.sin(x); }
});

Java 8+:Lambda 表達式與方法引用

// 使用 java.util.function 標準函數型介面
void compute(DoubleUnaryOperator f) {
    IntStream.rangeClosed(1, 10).forEach(k -> System.out.println(f.applyAsDouble(k)));
}

// Lambda 呼叫
compute(x -> Math.sin(x));
compute(x -> x * x + 2 * x + 1);

// 方法引用
compute(Math::sin);
compute(MyClass::customFunc);

標準函數型介面速查

介面參數返回適用場景
Function<T,R>TR通用轉換
Predicate<T>Tboolean條件判斷
Consumer<T>Tvoid消費處理
Supplier<T>無T延遲生成
UnaryOperator<T>TT同類型轉換
BinaryOperator<T>T, TT聚合運算
DoubleUnaryOperatordoubledouble基本類型避免裝箱

進階:高階函數與柯里化

// 返回函數的函數
Function power = n -> x -> Math.pow(x, n);
DoubleUnaryOperator square = power.apply(2);
DoubleUnaryOperator cube = power.apply(3);

// 組合函數
DoubleUnaryOperator sinSquared = x -> Math.sin(x) * Math.sin(x);
// 或
DoubleUnaryOperator sinSquared = Math::sin.andThen(v -> v * v);

性能與最佳實踐

  • 優先使用基本類型專用介面(IntPredicate 等)避免裝箱拆箱。
  • Lambda 捕獲局部變量需 final 或 effectively final。
  • 序列化需求時實現 Serializable 介面:(Serializable & DoubleUnaryOperator) x -> Math.sin(x)。
  • 方法引用優於 Lambda 可讀性,但注意多態調用差異(instance::method vs Class::method)。

遷移建議

舊代碼庫可逐步替換:單抽象方法介面 → @FunctionalInterface 註解 → Lambda/方法引用。保持介面語義不變,僅簡化調用點代碼。

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