without variable used should for effectively lambda java-8

lambda - used - ¿Por qué las variables dentro del bucle foreach de java8 deberían ser finales?



java foreach without lambda (1)

Estoy iterando una lista de matrices en Java 7 loop y Java 8 forEach loop. Java 8 loop quiere que la variable dentro del loop sea final. Por ejemplo,

List<String> testList = Arrays.asList( "apple", "banana", "cat", "dog" ); int count = 0; testList.forEach( test -> { count++; // compilation Error : Local variable count defined in an enclosing scope must be final or effectively final }); for( String test: testList ) { count++; // No Error }

¿Alguien puede explicar por qué es así? ¿Es un inconveniente de Java 8?


El modelo de memoria de Java tiene una propiedad muy importante: garantiza que las variables locales y los parámetros del método nunca se puedan escribir en otro hilo. Esto añade mucha seguridad a la programación de subprocesos múltiples. Sin embargo, cuando creas un lambda (o una clase anónima), nadie sabe cómo se usará. Se puede pasar a otro subproceso para su ejecución (por ejemplo, si usa parallelStream().forEach(...) ). Si fuera posible modificar la variable local, esa propiedad importante se violaría. No es lo que los desarrolladores de lenguaje Java sacrificarían.

Por lo general, cuando está utilizando lambdas, está intentando programar de manera funcional. Pero en la programación funcional, las variables mutables se consideran una mala práctica: es mejor asignar cada variable solo una vez. Así que tratar de modificar la variable local realmente huele. Use varios métodos de reducción de flujo en lugar de forEach para producir un buen código funcional.