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
(你在你的问题中使用了Function
和BiFunction
,但是因为它们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
});
我们有以下场景:
测试中期,需要更新一些上下文变量。测试中的确切位置以及究竟应该发生什么是可变的。我想提供一个 "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
(你在你的问题中使用了Function
和BiFunction
,但是因为它们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
});