Scala中是否有lambda函数?

Dun*_*gor 7 lambda closures scala function

我有一个Java类,可以访问我想从Scala使用的事务上下文.所以我认为我会编写一个Java方法,它接受Scala函数并在事务中调用它 -

class Context {
    @Transactional public void runInTx(Function0<scala.Unit> f) {
        f.apply();
    }
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我希望能够将Scala闭包传递给它

def deleteItems(ids: Set[Long]) = {
  context.runInTx { ids foreach { dao.delete(_) } }
}
Run Code Online (Sandbox Code Playgroud)

但不能因为runInTx实际上并ids foreach { dao.delete(_) }没有按名称来呼叫,实际上并不是一个Function0.

现在我可以通过一个小小的thunk来解决这个问题

def deleteItems(ids: Set[Long]) = {
  def localApply(f: => Unit) = context.applyInTx(f _)
  localApply { ids foreach { dao.delete(_) } }
}
Run Code Online (Sandbox Code Playgroud)

但在我看来,我需要一个lambda函数来生成一个未命名Function0的代码块.

API中是否存在这样的事情,或者我将如何编写它?

Dun*_*gor 11

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

所以在这种情况下:

def deleteItems(ids: Set[Long]) = {
  context.runInTx {() => ids foreach { dao.delete(_) } }
}
Run Code Online (Sandbox Code Playgroud)

() => ids foreach { dao.delete(_) }是函数文字的完整形式.编译器允许在可以推断出需要函数的地方省略参数列表 - 这对于按名称调用是正确的,但是当传递给采用a的方法时似乎不成立Function