java - BiFunction 接口(interface)中的 compose 方法是什么样的?

标签 java function functional-interface function-composition

Function 接口(interface)具有 compose()andThen() 方法,而 BiFunction 接口(interface)仅具有andThen() 方法。我的问题是如何实现相应的方法?我将尝试以图形方式表示这一点。

BiFunction without compose

单个字母是由 Java 的 FunctionBiFunction 接口(interface)定义的参数化类型。箭头表示输入和输出的流程。带有连接箭头的框是函数。虚线框只是展示了apply方法的使用方式。

最佳答案

FunctionCompose()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()...
}

这是完成的图表:

enter image description here

这是正在使用的:

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/

相关文章:

java - 相同的 ArrayList 但不同的对象顺序

javascript - 使用 <span> 彩虹滚动文本

javascript - 使用回调的高阶文件夹函数

C...字符串分割问题

lambda - 为什么 Java Lambda 类型推断仅处理具有唯一参数的方法?

java - 如何允许更精确类型的消费者作为不太精确类型的消费者传入?

java - 用于注册的 REST API

java - ConcurrentModificationException 尽管使用同步

java - 为什么这个 Java 方法调用被认为是不明确的?

java - 打开文件以查看其内容