为什么函数组合在 IntFunction 中不可用

Why function composing not available in IntFunction

我正在阅读第 3 章现代 Java 中的函数组合部分。

我不明白为什么我不能编写 IntFunctions。我是犯了一个愚蠢的错误还是这背后有什么设计决定?

这是我的代码,注释有误

package mja;

import java.util.function.Function;
import java.util.function.IntFunction;

public class AppTest2 {
    public static void main(String[] args) {
        
        IntFunction<Integer> plusOne = x -> x+1;
        IntFunction<Integer> square = x -> (int) Math.pow(x,2);
        
        // Compiler can't find method andThen in IntFunction and not allowing to compile
        IntFunction<Integer> incrementThenSquare = plusOne.andThen(square); 
        int result = incrementThenSquare.apply(1);

        Function<Integer, Integer> plusOne2 = x -> x + 1;
        Function<Integer, Integer> square2 = x -> (int) Math.pow(x,2);
        
        //Below works perfectly
        Function<Integer, Integer> incrementThenSquare2 = plusOne2.andThen(square2);
        int result2 = incrementThenSquare2.apply(1);
    }
}

好吧,在你的例子中,使用 IntFunction<Integer> 并不是一个真正的最佳选择,这可能是你被卡住的原因。

当尝试处理一个接受 int 和 return 一个 int 的函数时,您想使用 IntUnaryOperator 方法 [=15] =] 你要找的。

它没有在 IntFunction<R> 中实现的原因是你不能确定你的函数将 return 下一个 IntFunction<R> 所需的输入,这是一个 int当然。

你的情况很简单,但想象一下有一个 IntFunction<List<String>>,你不能链接函数,因为 IntFunction<R> 不接受 List<String> 作为输入。


这是你更正的例子

IntUnaryOperator plusOne = x -> x + 1;
IntUnaryOperator square = x -> (int) Math.pow(x, 2);

IntUnaryOperator incrementThenSquare = plusOne.andThen(square);
int result = incrementThenSquare.applyAsInt(1);

System.out.println("result = " + result); // result = 4