我有一个 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中是否存在这样的东西,或者我将如何编写它?

请您参考如下方法:

您可以通过添加(在这种情况下缺少)参数来告诉编译器将 block 解释为函数而不是要立即调用的语句。

所以在这种情况下:

def deleteItems(ids: Set[Long]) = { 
  context.runInTx {() => ids foreach { dao.delete(_) } } 
} 
() => ids foreach { dao.delete(_) }是函数字面量的完整形式。编译器允许在可以推断出需要函数的地方省略参数列表——这对于按名称调用是正确的,但在传递给采用 Function 的方法时似乎不是这样。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!