gpt4 book ai didi

java - 如何将 Java 中的 obj-c block 模拟为 Lambda?

转载 作者:行者123 更新时间:2023-12-01 09:48:43 26 4
gpt4 key购买 nike

下面的模式有点像 Obj-C 的 block 。我想知道是否可以使用 java 8 的 Lambda 重写它。如果这样做,执行 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 只能在需要函数接口(interface)的地方使用。函数式接口(interface)只有一个抽象方法。因此,您必须将 runnableBlock 拆分为两个参数。 Consumer 似乎是标准库中合适的接口(interface)。

无论如何,它不会产生新线程。 Lambda 只是函数式接口(interface)匿名实现的语法替代。它们本质上与多线程没有关系。

<小时/>

示例代码(缩短):

// 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 中看起来有点尴尬。

关于java - 如何将 Java 中的 obj-c block 模拟为 Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37772886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com