我有一个Java类,可以访问我想在Scala中使用的事务上下文。所以我认为我会编写一个Java方法,它接受Scala函数并在事务中调用它 -
class Context {
@Transactional public void runInTx(Function0<scala.Unit> f) {
f.apply();
}
到目前为止一切顺利。我希望能够将Scala闭包传递给它
def deleteItems(ids: Set[Long]) = {
context.runInTx { ids foreach { dao.delete(_) } }
}
但不能,因为runInTx
实际上并未按名称进行调用,而ids foreach { dao.delete(_) }
实际上并不是Function0
。
现在我可以通过一个小的thunk来解决这个问题
def deleteItems(ids: Set[Long]) = {
def localApply(f: => Unit) = context.applyInTx(f _)
localApply { ids foreach { dao.delete(_) } }
}
但在我看来,我需要一个lambda函数来从代码块中生成一个未命名的Function0
。
API中是否存在此类内容,或者我将如何编写它?
答案 0 :(得分:11)
您可以告诉编译器将块解释为函数,而不是通过添加(在这种情况下缺少)参数来立即调用的语句。
所以在这种情况下:
def deleteItems(ids: Set[Long]) = {
context.runInTx {() => ids foreach { dao.delete(_) } }
}
() => ids foreach { dao.delete(_) }
是函数文字的完整形式。编译器允许在可以推断出需要函数的地方省略参数列表 - 这对于按名称调用是正确的,但是当传递给采用Function
<的方法时似乎不成立/ p>