Есть ли лямбда-функция в Scala? - PullRequest
7 голосов
/ 18 ноября 2011

У меня есть класс 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.

Теперь я могу решить эту проблему с небольшим толчком

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

но мне кажется, что мне нужна лямбда-функция для получения неназванного Function0 из блока кода.

Существует ли такая вещь в API или как мне ее написать?

1 Ответ

11 голосов
/ 18 ноября 2011

Вы можете указать компилятору интерпретировать блок как функцию, а не как оператор, который должен быть вызван немедленно, путем добавления (в данном случае отсутствия) параметров.

Так что в этом случае:

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

() => ids foreach { dao.delete(_) } - полная форма литерала функции. Компилятор позволяет опустить список параметров в тех местах, где он может сделать вывод, что требуется функция - это верно для вызова по имени, но, похоже, не так при передаче в метод, принимающий Function

...