【问题标题】:Is there a lambda function in Scala?Scala中有lambda函数吗?
【发布时间】:2012-01-01 11:04:09
【问题描述】:

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

【问题讨论】:

    标签: function scala lambda closures


    【解决方案1】:

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

    所以在这种情况下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2019-08-20
      相关资源
      最近更新 更多