[英]How to simulate obj-c blocks in Java as Lambdas?
下面的模式有点像Obj-C的块。 我想知道是否可以使用Java 8的Lambdas重写它。 如果这样做的话,执行lambda会跨越一个新线程,还是会在同一线程中运行?
private interface RunnableBlock {
public void runA(MyObj myObj);
public void runB(MyObj myObj);
}
// frequently used method
private MyObj operateOnMyObj(short someParams, RunnableBlock runnableBlock) throws Exception {
// do a lot of stuff...
// MyObj is generated here
MyObj myObj = // blah blah..
if(myCondition) {
//common pre-runnable
runnableBlock.runA(myObj);
//common post-runnable
} else {
//other common pre-runnable
runnableBlock.runB(myObj);
//other common post-runnable
}
return myObj;
}
public void aMyObjConsumer() {
// now to use the above
MyObj myObj = operateOnMyObj(someParam,
new RunnableBlock() {
@Override public void runA(MyObj myObj) {
// do stuff..
}
@Override public void runB(MyObj myObj) {
// do different stuff..
}
}
);
}
我不了解Objective-C,但是我想您想根据某种条件运行两个不同的代码,以lambda表达式的形式传递? 那在Java中不起作用。
Lambda只能在需要功能接口的地方使用。 功能接口只有一种抽象方法。 因此,您必须将runnableBlock
分为两个参数。 Consumer
似乎是标准库中的适当接口。
无论如何,它不会产生新线程。 Lambda只是功能接口的匿名实现的语法替代。 它们与多线程并不是天生的关系。
示例代码(缩短):
// frequently used method
private MyObj operateOnMyObj(Consumer<MyObj> block1, Consumer<MyObj> block2 {
// ...
if (myCondition) {
block1.accept(myObj);
} else {
block2.accept(myObj);
}
return myObj;
}
public void aMyObjConsumer() {
// now to use the above
MyObj myObj = operateOnMyObj((myObj) -> { /* do stuff */ }, (myObj) -> { /* do different stuff */ });
}
我认为menu
是一个错字,应该读runnableBlock
,因为在其他任何地方都没有使用runB
。
同样,我不知道它如何在Objective-C中工作,但是在Java中看起来有点尴尬。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.