for (Canvas canvas : list) {
}
NetBeans me sugiere usar "operaciones funcionales":
list.stream().forEach((canvas) -> {
});
Pero, ¿por qué se prefiere esto ? En todo caso, es más difícil de leer y entender. Está llamando stream()
, luego forEach()
utilizando una expresión lambda con parámetro canvas
. No veo cómo es eso mejor que el for
bucle en el primer fragmento.
Obviamente solo hablo por estética. Quizás hay una ventaja técnica aquí que me falta. ¿Qué es? ¿Por qué debería usar el segundo método en su lugar?
java
lambda
java8
stream-processing
Omega
fuente
fuente
Respuestas:
Las secuencias proporcionan una abstracción mucho mejor para la composición de las diferentes operaciones que desea realizar además de las colecciones o secuencias de datos que ingresan. Especialmente cuando necesita asignar elementos, filtrarlos y convertirlos.
Tu ejemplo no es muy práctico. Considere el siguiente código del sitio de Oracle .
se puede escribir usando secuencias:
La segunda opción es mucho más legible. Entonces, cuando tiene bucles anidados o varios bucles que realizan un procesamiento parcial, es un muy buen candidato para el uso de Streams / Lambda API.
fuente
stream.map(f).map(g)
≡stream.map(f.andThen(g))
) (cuando se construye una secuencia en un método y luego se pasa a otro método que la consume, el compilador puede eliminar la secuencia) y la fusión de secuencia (que puede fusionar muchas operaciones de secuencia juntos en un solo ciclo imperativo), lo que puede hacer que las operaciones de transmisión sean mucho más eficientes. Se implementan en el compilador Haskell de GHC, y también en algunos otros compiladores de lenguaje funcional de Haskell y otros, y hay implementaciones de investigación experimental para Scala.Otra ventaja de usar la API de transmisión funcional es que oculta los detalles de la implementación. Solo describe lo que debe hacerse, no cómo. Esta ventaja se vuelve obvia cuando se observa el cambio que debe hacerse, para cambiar de ejecución de código único a paralelo. Solo cambia el
.stream()
a.parallelStream()
.fuente
Eso es altamente subjetivo. Encuentro la segunda versión mucho más fácil de leer y entender. Coincide con cómo lo hacen otros idiomas (por ejemplo, Ruby, Smalltalk, Clojure, Io, Ioke, Seph), requiere menos conceptos para entender (es solo una llamada a un método normal como cualquier otro, mientras que el primer ejemplo es una sintaxis especializada).
En todo caso, es una cuestión de familiaridad.
fuente