gpt4 book ai didi

java - 如何链接 BiFunctions?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:15 24 4
gpt4 key购买 nike

我想链接 BiFunctions,就像下面代码示例中的方法 chainWanted 一样。

BiFunction 将 Function 作为 AndThen 的参数。是否有可能以某种方式链接 BiFunctions ?

因此,这里的代码无法编译,我无法将 BiFunction 转换为 Function。

import java.util.function.BiFunction;
import java.util.function.Function;

import org.openqa.selenium.remote.RemoteWebDriver;

public class Wf {

BiFunction<RemoteWebDriver, WfParams, RemoteWebDriver> init = this::init;
BiFunction<RemoteWebDriver, WfParams, RemoteWebDriver> wait = this::wait;

BiFunction<RemoteWebDriver, WfParams, RemoteWebDriver> chainNow = init
.andThen(d -> {
System.out.println("--------------");
return null;
});

BiFunction<RemoteWebDriver, WfParams, RemoteWebDriver> chainWanted = init
.andThen((BiFunction) wait);

public RemoteWebDriver init(RemoteWebDriver d, WfParams params) {
System.out.println("init(d, params)");
return d;
}

public RemoteWebDriver wait(RemoteWebDriver d, WfParams params) {
System.out.println("Wf.wait(d, params)");
return d;
}

public static void main(String[] args) throws Exception {
new Wf().start();
}

private void start() {
chainNow.apply(null, null);
}
}

最佳答案

将一个 Function 链接到另一个函数很自然,因为第一个函数的返回值作为参数传递给下一个函数,而该函数的返回值作为参数传递给后续函数,等等。这不适用于 BiFunction,因为它们有两个参数。第一个参数是前一个函数的返回值,但第二个参数是什么?它还解释了为什么 BiFunction 允许使用 andThen 链接到一个 Function 而不是另一个 BiFunction

然而,这表明,如果有某种方法可以为第二个参数提供值,则可以将一个 BiFunction 链接到另一个。这可以通过创建一个辅助函数来完成,该辅助函数将第二个参数的值存储在局部变量中。然后,通过从环境中捕获局部变量并将其用作第二个参数,可以将 BiFunction 转换为 Function

这就是它的样子。

BiFunction<RemoteWebDriver, WfParams, RemoteWebDriver> chainWanted = this::chainHelper;

RemoteWebDriver chainHelper(RemoteWebDriver driver, WfParams params) {
return
init.andThen(rwd -> wait.apply(rwd, params))
.apply(driver, params);
}

// ...

chainWanted.apply(driver, params);

chainHelper 方法保存 params 参数供以后捕获。我们调用 init.andThen() 来进行链接。但这需要一个 Functionwait 是一个 BiFunction。我们不使用方法引用 this::wait,而是使用 lambda 表达式

rwd -> wait.apply(rwd, params)

从词法环境中捕获 params。这给出了一个 lambda 表达式,它接受一个参数并返回一个值,所以它现在是一个 Function 包装了 wait 这是一个 BiFunction .这是一个部分应用柯里化(Currying) 的例子。最后,我们使用 apply() 调用生成的 BiFunction,并传递原始参数。

关于java - 如何链接 BiFunctions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com