Vengo de Groovy y tiene un método .with
en cada tipo que acepta un cierre de argumento único; el argumento es el objeto sobre el que se llama el método .with
. Esto permite una técnica muy buena para extender las capacidades de encadenamiento funcional, lo que lo libera de la obligación de introducir variables temporales, factores su código, hace que sea más fácil de leer y hace otras sutilezas..with alternativa en scala
Quiero ser capaz de hacer algo como esto:
Seq(1, 2, 3, 4, 5)
.filter(_ % 2 == 0)
.with(it => if (!it.isEmpty) println(it))
En lugar de
val yetAnotherMeaninglessNameForTemporaryVariable =
Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
if (!yetAnotherMeaninglessNameForTemporaryVariable.isEmpty)
println(yetAnotherMeaninglessNameForTemporaryVariable)
En otras palabras, en el primer ejemplo, el .with
es un poco similar a .foreach
pero en lugar de iterar a través los elementos del objeto al que se está llamando una vez en el objeto mismo. Entonces it
es igual a Seq(1, 2, 3, 4, 5).filter(_ % 2 == 0)
.
Desde que era muy sorprendido no encontrar nada parecido en Scala, mis preguntas son:
- me estoy perdiendo algo?
- ¿hay alguna técnica alternativa nativa de Scala?
- si no, ¿hay algún motivo de peso por el que esta característica no esté implementada en Scala?
Actualización: una solicitud de función apropiada ha sido publicado en el seguimiento de incidencias Scala: https://issues.scala-lang.org/browse/SI-5324. Por favor vote y promocione
Solo una nota: 'con' es una palabra reservada en Scala, por lo que el método no podría nombrarse de la misma manera. Todavía debería existir bajo otro nombre; esta es la pregunta y respuesta más comunes de Scala en StackOverflow por lo que puedo decir ("no existe, haz tu propia así"). –
Creo que el nombre 'convert' encajaría mejor, lo que sugiere que este método no debería tener efectos secundarios y, como toma la llamada como parámetro y devuelve algo nuevo, debe ser algún tipo de conversión. En ese sentido, esta función sería insustituible en la biblioteca estándar. También como se sugiere en http://stackoverflow.com/a/8538277/485115 también debe haber una variante de efecto lateral llamada 'tap', que devuelve el objeto llamante. –