Java 8 函数 - "wrapper" 在执行给定的 lambda 之前做某事的函数?

Java 8 Function - "wrapper" function that does something before executing given lambda?

我们有以下场景:

测试中期,需要更新一些上下文变量。测试中的确切位置以及究竟应该发生什么是可变的。我想提供一个 "wrapper" 函数,它设置一些上下文变量,然后执行函数调用中提供给它的所有断言。

因此,类似于以下内容:

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

    setupDefaultContextA();
    noArgsCall.invoke() // not sure how apply() would be invoked here
}

或:

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

    setupContext(providedContext); // not sure how apply() would be invoked here
}

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

@Test
public void testSomething() {

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

    withContext((new Context(...)) -> {
        ... // do some asserts
    }
}

我怎样才能做到这一点? Java8个函数可以这样用吗?如果没有,我还有其他方法可以实现吗?

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

你可以这样做:

public static void withDefaultContext(Runnable original) {
    setupDefaultContextA();
    original.run();
}

那么,您可以使用上面的方法如下:

withDefaultContext(() -> {
    // do some asserts
});

或具有特定上下文:

public static void withContext(Context context, Runnable original) {
    setupContext(context);
    original.run();
}

用法:

withContext(new Context(...), () -> {
    // do some asserts
});