Objective块与Java等效
Apple Objective-C语言有一个对我非常有用的特性:我可以将代码块作为参数传递给方法 我也想用Java来做。 比如:Objective块与Java等效,java,objective-c-blocks,Java,Objective C Blocks,Apple Objective-C语言有一个对我非常有用的特性:我可以将代码块作为参数传递给方法 我也想用Java来做。 比如: myManager.doSomethingInTransaction(function() { dao.save(); }); 因此,myManager对象将在startTransaction()和endTransaction()方法之间执行我的代码 有没有办法在Java中实现这一点?不幸的是,Java不支持这一点。但是您可以通过匿名类获得类似的功能 为此
myManager.doSomethingInTransaction(function() {
dao.save();
});
因此,myManager对象将在startTransaction()和endTransaction()方法之间执行我的代码
有没有办法在Java中实现这一点?不幸的是,Java不支持这一点。但是您可以通过匿名类获得类似的功能 为此,首先定义一个接口:
interface TransactionAction {
public void perform();
}
myManager.doSomethingInTransaction(new Runnable() {
public void run() {
dao.save();
}
});
然后应将doSomethingTransaction
定义为将TransactionAction
作为参数
然后,当您调用它时,请执行以下操作:
myManager.doSomethingInTransaction(new TransactionAction() {
public void perform() {
dao.save();
}
});
不,这在Java中还不存在。解决方法是使用
Runnable
界面:
interface TransactionAction {
public void perform();
}
myManager.doSomethingInTransaction(new Runnable() {
public void run() {
dao.save();
}
});
或者任何带有单个方法的接口都可以。您可以使用类似
interface CodeBlock {
void execute();
}
函数看起来像
someType functionToBeExecuted(CodeBlock cb) {
...
}
它会被称为
functionToBeExecuted(new CodeBlock() {
void execute() {
// blah
}
});
但是,如果您的代码能够访问中的变量或字段,那么它将更加专业化。由于新对象的存在,这种方式的性能也会降低。现在,在Java 8中,使用lambda表达式就可以实现这一点:
myManager.doSomethingInTransaction(() -> {
dao.save();
});
或者更简洁地说:
myManager.doSomethingInTransaction(() -> dao.save());
doSomethingTransaction
的实现应该接受一个Runnable
参数,或者任何其他具有匹配方法签名的单一方法接口
您可以在这里找到Oracle的文档:简单的答案是“不”,Java中没有类似的功能。2014年的答案似乎是“只使用可运行的”。这是最好的解决方案!这甚至可以简化为
myManager.doSomethingInTransaction(dao::save)代码>我可以参考lambda吗?