Apple Objective-C语言的一个特性对我来说非常有用:我可以将代码块作为方法中的参数传递。
我也想用Java做到这一点。 类似的东西:
myManager.doSomethingInTransaction(function() {
dao.save();
});
因此myManager对象将在startTransaction()和endTransaction()方法之间执行我的代码。
有没有办法在Java中获得它?
答案 0 :(得分:41)
不幸的是,Java不支持这一点。但是你可以使用匿名类获得类似的功能。
为此,首先要定义一个界面:
interface TransactionAction {
public void perform();
}
然后应该定义 doSomethingInTransaction
以TransactionAction
作为参数。
然后,当你打电话时,请执行以下操作:
myManager.doSomethingInTransaction(new TransactionAction() {
public void perform() {
dao.save();
}
});
答案 1 :(得分:12)
在Java中还没有这个(尚未)。解决方法是使用Runnable
接口:
myManager.doSomethingInTransaction(new Runnable() {
public void run() {
dao.save();
}
});
或任何具有单一方法的界面都可以。
答案 2 :(得分:3)
你可以使用像
这样的界面interface CodeBlock {
void execute();
}
该功能看起来像
someType functionToBeExecuted(CodeBlock cb) {
...
}
它会被称为
functionToBeExecuted(new CodeBlock() {
void execute() {
// blah
}
});
但是如果你的代码应该能够访问变量或字段将更加专业化。由于新对象,性能也会降低。
答案 3 :(得分:2)
现在可以在Java 8中使用lambda表达式:
myManager.doSomethingInTransaction(() -> {
dao.save();
});
或更简洁:
myManager.doSomethingInTransaction(() -> dao.save());
doSomethingInTransaction
的实现应该接受Runnable
参数或具有匹配方法签名的任何其他单方法接口。
您可以在此处找到Oracle的文档:https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html