El siguiente código Scala funciona y se puede pasar a un método Java que espera una función. ¿Hay una forma más limpia de hacer esto? Aquí está mi primer pase:
val plusOne = new java.util.function.Function[Int,Int] {
override def apply(t:Int):Int = t + 1
override def andThen[V](after:function.Function[_ >: Int, _ <: V]):
function.Function[Int, V] = ???
override def compose[V](before:function.Function[_ >: V, _ <: Int]):
function.Function[V, Int] = ???
}
Aquí está mi segundo paso: utiliza un contenedor genérico para la interfaz de la función Java-8 para simplificar la sintaxis de Scala:
// Note: Function1 is Scala's functional interface,
// Function (without the 1) is Java 8's.
case class JavaFunction1[U,V](f:Function1[U,V]) extends Function[U,V] {
override def apply(t: U): V = f(t)
override def compose[T](before:Function[_ >: T, _ <: U]):
Function[T, V] = ???
override def andThen[W](after:Function[_ >: V, _ <: W]):
Function[U, W] = ???
}
val plusOne = JavaFunction1((x:Int) => x + 1)
val minusOne = JavaFunction1((x:Int) => x - 1)
¿Podemos hacerlo mejor?
Como seguimiento, ¿hay alguna posibilidad de que Scala algún día use el código de operación dinámico de invocación como lo hace Java 8 para su aplicación de función de primera clase? ¿Eso hará que todo funcione mágicamente, o todavía tendrá que haber una conversión sintáctica?
fuente
you should be able to assign Scala lambdas
- Esto significa que, en Scala 2.11, ¿se puede pasar una función Scala como argumento para un Lambda Java8?java.util.function.Consumer[scala.Function1[Integer, String]]
, se puede hacer antes de 2.11 también.