// 定義函數型介面
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.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> | T | R | 通用轉換 |
Predicate<T> | T | boolean | 條件判斷 |
Consumer<T> | T | void | 消費處理 |
Supplier<T> | 無 | T | 延遲生成 |
UnaryOperator<T> | T | T | 同類型轉換 |
BinaryOperator<T> | T, T | T | 聚合運算 |
DoubleUnaryOperator | double | double | 基本類型避免裝箱 |
// 返回函數的函數
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 等)避免裝箱拆箱。final 或 effectively final。Serializable 介面:(Serializable & DoubleUnaryOperator) x -> Math.sin(x)。instance::method vs Class::method)。舊代碼庫可逐步替換:單抽象方法介面 → @FunctionalInterface 註解 → Lambda/方法引用。保持介面語義不變,僅簡化調用點代碼。