package ar.com.javacuriosities.lambdas;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
/*
* Desde una Lambda Expression podemos referenciar variables externas siempre y cuando
* estas sean "effectively final".
* Una variable "effectively final" es aquella que cumple los requerimientos para ser marcada como final
* pero no lo es
*/
public class Lesson05ExternalVariables {
public static void main(String[] args) {
String message = "Hello World";
// Aca creamos un lambda que esta referenciando a la variable externa
// message
Supplier<String> messageProvider = () -> message;
System.out.println(messageProvider.get());
List<String> words = Arrays.asList("Welcome", "Lambdas", "to", "Java");
WordCounter wordCounter = new WordCounter();
wordCounter.count(words);
System.out.println(wordCounter.getCounter());
}
private static final class WordCounter {
private int counter;
public WordCounter() {
}
public void count(List<String> data) {
/*
* Además podemos referenciar variables de instancia dado que dentro de un
* Lambda this se refiere al objeto que contiene al Lambda, en el siguiente
* ejemplo se puede ver como invocamos "counter++" desde nuestro Lambda, aunque
* al principio esto puede sonar contradictorio porque los Lambda necesitan referenciar
* "effectively final" variables y aqui vemos que incrementamos la variable, lo que sucede
* Aquí es que el compilar automáticamente transforma el código a "this.counter++" y la variable
* this es "effectively final"
*/
data.forEach(value -> counter++);
}
public int getCounter() {
return counter;
}
}
}