java - 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 函数吗?如果没有,还有其他方法可以实现吗?
解决方案
似乎你想装饰任何给定的Runnable
(你在你的问题中使用Function
and 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
});
推荐阅读
- html - 我的列表元素之一的位置低于其余元素,即使它们都具有相同的高度
- android - 列出android aar库中用到的所有依赖
- c++ - boost::container::allocator_traits::is_partially_propagable 是什么意思?
- rest - FindFirstByAttribute 的 RESTful 路由结构
- c++ - 转换构造函数不接受花括号列表
- tensorflow - 使用 bazel 运行时找不到 Tensorflow toco pacakage
- python - How to delete columns without headers in python pandas read_csv
- wpf - 插件应用程序中的 Prism WPF 导航
- winforms - 为什么这个 WinForms 窗口在拖动时会呈现工件?
- python - 我可以有一个带有破折号的交互式 html5 画布吗?