package ar.com.javacuriosities.lambdas;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
/*
* Con la inclusion de Lambdas Expressions se agregaron
* varios métodos en el API de Java.
*/
public class Lesson06NewMethods {
public static void main(String[] args) {
// Iterable interface: Se agrego el método forEach(Consumer<T> c)
List<String> words = Arrays.asList("Welcome", "Lambdas", "to", "Java");
words.forEach(word -> System.out.println(word));
// Collection interface: Se agrego el método removeIf(Predicate<T> p)
List<String> data = new ArrayList<String>(words);
data.removeIf(element -> "Lambdas".equals(element));
System.out.println(data);
/*
* List interface:
* - Se agrego el método replaceAll(UnaryOperator<T> o)
* - Se agrego el método sort(Comparator<T> c), este método reemplaza a Collections.sort(List<T> l, Comparator<T> c)
*/
List<Integer> numbers = new ArrayList<>();
numbers.add(99);
numbers.add(11);
numbers.add(33);
data.replaceAll(element -> element.toUpperCase());
System.out.println(data);
numbers.sort((left, right) -> left.compareTo(right));
System.out.println(numbers);
/*
* Logger class: Se agregaron variantes para poder recibir un Supplier
* con esto logramos "Deferred Execution" lo cual quiere decir
* que la logica del Supplier no sera ejecutada hasta que sea necesario
*
*/
Logger logger = Logger.getLogger(Lesson06NewMethods.class.getName());
// En este caso la concatenación de los String solo será realizada si el logger esta configurado en nivel INFO o alguno inferior
logger.info(()->"Hello" + " " + "World");
/*
* Map interface:
* - Se agrego el método compute, computeIfAbsent, computeIfPresent, estos métodos sirven generalmente cuando queremos tomar un valor del Map hacer algo con el y guardar un nuevo valor para esa key
* - Se agrego el método forEach
* - Se agrego el método merge
* - Se agrego el método getOrDefault
* - Se agrego el método putIfAbsent, que antes solo estaba presente para ConcurrentHashMap
* - Se agrego el método remove para un key-value especifico
* - Se agrego el método replace para un key simple y también para un key-value especifico
*/
Map<String, Integer> keyValuePairs = new HashMap<>();
keyValuePairs.computeIfAbsent("FirstKey", (key) -> 99);
keyValuePairs.computeIfAbsent("FirstKey", (key) -> 11);
System.out.println(keyValuePairs);
keyValuePairs.computeIfPresent("FirstKey", (key, value) -> 33);
System.out.println(keyValuePairs);
// Aca si la key existe podemos cambiar su valor sino estamos creando un nuevo entry en el Map
keyValuePairs.compute("SecondKey", (key, value) -> 66);
System.out.println(keyValuePairs);
keyValuePairs.forEach((key, value) -> System.out.println(key + "=" + value));
// Si la key no existe la función no es ejecutada
keyValuePairs.merge("ThirdKey", 77, (currentValue, suggestValue) -> currentValue + suggestValue);
System.out.println(keyValuePairs);
// Si la key existe se ejecuta la función para hacer merge de los valores
keyValuePairs.merge("ThirdKey", 33, (currentValue, suggestValue) -> currentValue + suggestValue);
System.out.println(keyValuePairs);
// El método getOrDefault busca la key o sino retorna el segundo parámetro
System.out.println(keyValuePairs.getOrDefault("ForthKey", 100));
keyValuePairs.remove("ThirdKey", 100);
System.out.println(keyValuePairs);
keyValuePairs.remove("ThirdKey", 110);
System.out.println(keyValuePairs);
keyValuePairs.replace("FirstKey", 99);
System.out.println(keyValuePairs);
}
}