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

Java 8函数-“;包装纸;在执行给定lambda之前执行某些操作的函数?,java,java-8,functional-interface,Java,Java 8,Functional Interface,我们有以下情况: 测试中期,需要更新一些上下文变量。测试的具体位置和应该发生什么是可变的。我想提供一个“包装器”函数,它设置一些上下文变量,然后执行函数调用中给出的所有断言 因此,类似于以下内容: public void withDefaultContextA(Function<???, Void> noArgsCall) { setupDefaultContextA(); noArgsCall.invoke() // not sure how apply() wo

我们有以下情况:

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

因此,类似于以下内容:

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

    setupDefaultContextA();
    noArgsCall.invoke() // not sure how apply() would be invoked here
}
我怎样才能做到这一点?Java8函数可以这样使用吗?如果没有,我还有其他方法可以实现这一点吗?

您似乎想修饰任何给定的
可运行的
(您在问题中使用
函数
双函数
,但当它们返回
无效
并且似乎没有收到任何参数时,使用
可运行的
在这里似乎更合适)

您可以这样做:

public static void withDefaultContext(Runnable original) {
    setupDefaultContextA();
    original.run();
}
然后,您可以按如下方式使用上述方法:

@Test
public void testSomething() {

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

    withContext((new Context(...)) -> {
        ... // do some asserts
    }
}
withDefaultContext(() -> {
    // do some asserts
});
或具有特定上下文:

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

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

如何使用
消费者
?一个void方法,它接受一个
上下文
与Lino一致,
函数
返回一个值作为唯一参数。似乎
Consumer
BiConsumer
更适合这个用例。这正是我所需要的。我想不起“装饰者”这个词。可能会让谷歌的搜索更加富有成效。:)谢谢
withContext(new Context(...), () -> {
    // do some asserts
});