En uno de los argumentos sobre las diferencias entre lambdas y clases anónimas, en esta publicación:

Java8 Lambdas vs clases anónimas

Leí una afirmación de que "Lambdas puede tener estado" al igual que las instancias de clase anónimas.

Hasta donde sé, no puede agregar el estado definido por el usuario que pertenece exclusivamente a lambda, ya que no hay forma de definir miembros de instancia en una implementación de una función lambda de Java.

Por ejemplo:

Runnable r=  () -> { int x = 5;  }; // defines a local - no way to define instance
Runnable r2 = new Runnable() {
    int x;  // defines state via instance member
    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
};

Solo para aclarar, no estoy tratando de introducir el estado en una lambda, ya que creo que eso va en contra de la intención. Solo estoy tratando de verificar o refutar un reclamo de naturaleza técnica realizado por una fuente confiable en la pregunta de desbordamiento de pila anterior.

2
Gonen I 23 ene. 2018 a las 14:59

3 respuestas

La mejor respuesta

Aunque la función lambda no tiene nada como variables de instancia, puede actualizar algún estado. Dependiendo de cómo lo considere, podría decir que la función lambda tiene su propio estado.

E.g.

Supplier<Integer> makeCountingLambda() {
    final int[] counter = new int[1];
    return (() -> ++counter[0]);
}

Supplier<Integer> f = makeCountingLambda();
f.get(); // 1
f.get(); // 2

f es una función lambda. Proporcionará un nuevo valor cada vez que se llame a get(), porque su estado se actualiza.

Algo así parece ser lo que el comentario referenciado estaba describiendo.

8
khelwood 23 ene. 2018 a las 14:29

¿Respuesta corta? No ¿Respuesta larga? Las lambdas no están destinadas a tener estados. La idea general de lambdas se basa en tener funciones únicas. Lea la documentación de lambda para más detalles. http://www.oracle.com/ webfolder / technetwork / tutorials / obe / java / Lambda-QuickStart / index.html Espero que esto ayude.

2
Levon Asatryan 23 ene. 2018 a las 12:12

No estoy seguro de qué quiere decir con estado. Si su pregunta es "¿puede lambda llevar valores, eso puede recordarse cada vez que invoco el mismo lambda", entonces la respuesta es no. Puedes hacer algún truco para alcanzar este tipo de comportamiento, pero no están destinados a esto. Si quieres tener un "estado", ¡entonces es mejor que uses una clase!

¡Avísame si no fue tu significado!

2
Tommaso Pasini 23 ene. 2018 a las 12:06