簡體   English   中英

如何將Java中的obj-c塊模擬為Lambdas?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM