Método de referencia con una llamada al constructor completo como una expresión lambda en Java

Nikolas:

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?

Eugene:

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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=173615&siteId=1
Recomendado
Clasificación