繁体   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