我正在阅读第三章现代Java中的函数组合部分。
我无法理解为什么我不能编写IntFunction。我是不是犯了一个愚蠢的错误,或者这背后有什么设计决定?
这是我的代码,在评论中有错误
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
并返回int
的函数时,您需要使用IntUnaryOperator
,它具有您要查找的方法andThen(IntUnaryOperator)
。
它没有在IntFunction<R>
中实现的原因是,您不能确定您的函数是否会返回下一个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