[英]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.