Используйте функцию Scala вместо анонимного объекта, подобного обратному вызову Java - PullRequest
2 голосов
/ 13 июля 2011

Анонимные обратные вызовы в стиле Java включают относительно много шаблонного и не приятны для чтения. Было бы неплохо иметь что-то вроде

workExpression

вместо

new SomeIF {
    @Override public someType doRun() {
        return workExpression
    }
}

Каковы возможные решения?

Ответы [ 2 ]

7 голосов
/ 13 июля 2011

Возможное решение - использовать implicit def для преобразования функций в устаревшие типы обратного вызова. Например:

// Required by some API
trait Callable[A] {
  def call(): A
}

trait Processor[A,B] {
  def process(a: A): B
}

// Our helper trait
trait MyImplicits {
  implicit def funToCallable[A](f: () => A) = new Callable[A]() { 
    def call() = f()
  }

  implicit def funToProcessor[A,B](f: (A) => B) = new Processor[A,B]() {
    def process(a: A) = f(a)
  }

}

object App extends MyImplicits {

  def main(args: Array[String]) {
    // Traditional usage
    runSomeCallable(new Callable[String]() {
      def call() = "World"
    })

    runSomeProcessor(new Processor[String,Int] {
      def process(a: String) = a.toInt * 2
    })

    // Usage with implicits
    runSomeCallable(() => "Scala World")

    runSomeProcessor((s: String) => s.toInt * 2)
  }

  // Methods defined by some foreign API
  def runSomeCallable[A](callable: Callable[A]) {
    println("Hello "+callable.call())
  }

  def runSomeProcessor(processor: Processor[String,Int]) {
    println("From 1 to "+processor.process("1"))
  }

}

Поэтому при работе с некоторым кодом можно создать вспомогательную черту для общих типов обратного вызова, используемых в этом коде, для облегчения читабельности.

2 голосов
/ 13 июля 2011

Автоматическое преобразование замыканий в интерфейсы с помощью одного метода может появиться в будущей версии Scala: http://www.scala -lang.org / node / 8744 Это позволит избежать использования шаблона, который в настоящее время необходим.

...