首页 > 解决方案 > Java 8 函数 - 在执行给定 lambda 之前执行某些操作的“包装器”函数?

问题描述

我们有以下场景:

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

因此,类似于以下内容:

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
    }
}

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

标签: javajava-8functional-interface

解决方案


似乎你想装饰任何给定的Runnable(你在你的问题中使用Functionand BiFunction,但是当它们返回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
});

推荐阅读