Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective块与Java等效_Java_Objective C Blocks - Fatal编程技术网

Objective块与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不支持这一点。但是您可以通过匿名类获得类似的功能 为此

Apple Objective-C语言有一个对我非常有用的特性:我可以将代码块作为参数传递给方法

我也想用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吗?