Function
接口(interface)具有 compose()
和 andThen()
方法,而 BiFunction
接口(interface)仅具有andThen()
方法。我的问题是如何实现相应的方法?我将尝试以图形方式表示这一点。
单个字母是由 Java 的 Function
和 BiFunction
接口(interface)定义的参数化类型。箭头表示输入和输出的流程。带有连接箭头的框是函数。虚线框只是展示了apply方法的使用方式。
最佳答案
Function
的 Compose()
和 andThen()
方法很简单,因为 Function
有一个输入和一个输出,因此只能以两种方式与另一个输出顺序串联。
由于 BiFunction
有一个输出,因此“after”函数必须是只有一个相应输入的函数,而 Function
符合要求。由于它有两个输入,“之前”函数需要有两个输出吗?你不能让一个方法返回两个东西,所以看起来不可能有“之前”。每个方法的返回类型与定义它们的接口(interface)相同,因此建议的方法应返回一个 BiFunction
。
我的建议是一种采用两个 Function
作为输入并返回一个 BiFunction
的方法。我不确定它还能是什么。它不能是两个 BiFunction
,因为返回类型必须是 QuaterFunction
。
下面是在 Java 库中编写的代码:
public interface BiFunction<T, U, R> {
// apply()...
default <V, W> BiFunction<V, W, R> compose(
Function<? super V, ? extends T> beforeLeft,
Function<? super W, ? extends U> beforeRight) {
Objects.requireNonNull(beforeLeft);
Objects.requireNonNull(beforeRight);
return (V v, W w) -> apply(beforeLeft.apply(v), beforeRight.apply(w));
}
// andThen()...
}
这是完成的图表:
这是正在使用的:
BiFunction<Integer, Integer, Integer> add = Integer::sum;
Function<Integer, Integer> abs = Math::abs;
BiFunction<Integer, Integer, Integer> addAbs = add.compose(abs, abs);
System.out.println(addAbs.apply(-2, -3));
// output: 5
如果你想实际测试一下,你可以这样做:
public interface BiFunctionWithCompose<T, U, R> extends BiFunction<T, U, R> {...
或者像这样:
package myutil;
public interface BiFunction<T, U, R> extends java.util.function.BiFunction<T, U, R> {...
我不知道这是否对任何人都有用,但思考和写作真的很有趣。祝你有美好的一天。
关于java - BiFunction 接口(interface)中的 compose 方法是什么样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71491161/