Java 8 函数 - 在执行给定 lambda 之前执行某些操作的“包装器”函数?

use*_*710 3 java java-8 functional-interface

我们有以下场景:

测试中,一些上下文变量需要更新。在测试中的确切位置以及确切应该发生的事情是可变的。我想提供一个“包装器”函数,它设置一些上下文变量,然后执行在函数调用中提供给它的所有断言。

因此,类似于以下内容:

public void withDefaultContextA(Function<???, Void> noArgsCall) {

    setupDefaultContextA();
    noArgsCall.invoke() // not sure how apply() would be invoked here
}
Run Code Online (Sandbox Code Playgroud)

或者:

public void withContextA(BiFunction<???, Context, Void> providedContextCall) {

    setupContext(providedContext); // not sure how apply() would be invoked here
}
Run Code Online (Sandbox Code Playgroud)

在相应的测试中,这些应该被调用如下:

@Test
public void testSomething() {

    withDefaultContextA(() -> {
        ... // do some asserts
    }

    withContext((new Context(...)) -> {
        ... // do some asserts
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?可以以这种方式使用 Java 8 函数吗?如果没有,还有另一种方法可以实现这一目标吗?

Fed*_*ner 5

似乎你想装饰任何给定的Runnable(你在你的问题中使用FunctionBiFunction,但当它们返回Void并且似乎没有收到任何参数时,使用Runnable在这里似乎更合适)。

你可以这样做:

public static void withDefaultContext(Runnable original) {
    setupDefaultContextA();
    original.run();
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以按如下方式使用上述方法:

withDefaultContext(() -> {
    // do some asserts
});
Run Code Online (Sandbox Code Playgroud)

或者在特定的上下文中:

public static void withContext(Context context, Runnable original) {
    setupContext(context);
    original.run();
}
Run Code Online (Sandbox Code Playgroud)

用法:

withContext(new Context(...), () -> {
    // do some asserts
});
Run Code Online (Sandbox Code Playgroud)