He encontrado hace poco tiempo con una respuesta competitiva mejor que la mía que utiliza un método de referencia bastante nuevo para mí como sustitución de lambda.
Stream.generate(new AtomicInteger(1)::getAndIncrement)...
Miré las especificaciones de Oracle sobre las referencias de métodos y no se definen 4 tipos:
- La referencia a un método estático
ContainingClass::staticMethodName
- La referencia a un método de instancia de un objeto particular
containingObject::instanceMethodName
- La referencia a un método de instancia de un objeto arbitrario de un tipo particular
ContainingType::methodName
- La referencia a un constructor
ClassName::new
Lucho con la categorización de éste. No he encontrado ninguna pregunta sobre SO o nada relevante se explica en la documentación. ¿Cómo se traduce esto a una clase anónima?
Mi sospecha es:
IntStream.generate(new IntSupplier() {
AtomicInteger atom = new AtomicInteger(1);
@Override
public int getAsInt() {
return atom.getAndIncrement();
}
})....
... No entiendo cómo es esto posible. A primera vista, yo supongo que la expresión es:
IntStream.generate(new IntSupplier() {
@Override
public int getAsInt() {
return new AtomicInteger(1).getAndIncrement();
}
})....
... sin embargo, esto no es más que () -> new AtomicInteger(1).getAndIncrement()
.
¿Dónde está este tipo de expresión define y cómo exactamente podría ser reescrita en el / clase anónima lambda?
Así new AtomicInteger(1)
devuelve una instancia, por lo que es el segundo. Los detalles exactos de cómo esto se traduce son específicos de la aplicación, pero es una sola instancia creada y esto está de vuelta ed-up por el JLS 15.13.3
En primer lugar, si la expresión de referencia método comienza con una ExpressionName o una primaria, se evalúa esta subexpresión
En la llanura Inglés, la parte antes ::
se evalúa cuando la declaración se encontró por primera vez .
Su suposición de cómo esto se traduce es casi correcta, es como si fuera la generación de una instancia de la propia función y el uso que - ya que es efectivamente final, esto está permitido.