lambdas y api stream - apuntes de java

Download Lambdas y API Stream - Apuntes de Java

If you can't read please download the document

Upload: alexis-lopez

Post on 21-Aug-2015

136 views

Category:

Software


2 download

TRANSCRIPT

  1. 1. Alexis Lpez @aa_lopez
  2. 2. Agenda Expresiones Lambda Stream API 11 22
  3. 3. Expresiones Lambda Funciones como valores/parmetros public static List filterGreenApples(List inventory) { List result = new ArrayList(); for(Apple apple: inventory){ if( "green".equals(apple.getColor() ) { result.add(apple); } } return result; } Solo manzanas verdes Crear un mtodo que retorne un listado que contenga solo las manzanas de color verde del listado pasado por parmetro Cdigo tomado del libro Java 8 in Action
  4. 4. Expresiones Lambda Funciones como valores/parmetros public static List filterApplesByColor(List inventory, String color) { List result = new ArrayList(); for(Apple apple: inventory){ if( apple.getColor().equals(color) ) { result.add(apple); } } return result; } Solo manzanas del color deseado Pero con el tiempo, tambin se requiere poder filtrar las manzanas de color rojo, por lo que intuitivamente adicionamos un parmetro ms... Cdigo tomado del libro Java 8 in Action
  5. 5. Expresiones Lambda Funciones como valores/parmetros public static List filterApplesByWeight(List inventory, int weight) { List result = new ArrayList(); for(Apple apple: inventory){ if( apple.getWeight() > weight ) { result.add(apple); } } return result; } Solo manzanas con un peso mnimo Pero tambin deseamos separar las manzanas dado su peso, lo que nos lleva a adicionar el siguiente mtodo... Cdigo tomado del libro Java 8 in Action
  6. 6. Expresiones Lambda Funciones como valores/parmetros List inventory = ... //Separar manzanas por color List greenApples = filterApplesByColor(inventory, "green"); List redApples = filterApplesByColor(inventory, "red"); //Separar manzanas por peso List heavyGreenApples = filterApplesByWeight(greenApples, 150); List heavyRedApples = filterApplesByWeight(redApples, 150); ... Con los anteriores mtodos, podramos escribir cdigo que nos permita realizar el filtrado de nuestras manzanas de la siguiente manera... Cdigo tomado del libro Java 8 in Action
  7. 7. Expresiones Lambda Funciones como valores/parmetros public static List filterApples(List inventory, String color, int weight, boolean flag) { List result = new ArrayList(); for (Apple apple: inventory){ if ( (flag && apple.getColor().equals(color)) || (!flag && apple.getWeight() > weight) ){ result.add(apple); } } return result; } Solo manzanas que cumplan con el color o el peso Sin embargo, para no caer en DRY (Don't Repeat Yourself) se podra tener un slo mtodo que haga el filtro dependiendo de una bandera... Cdigo tomado del libro Java 8 in Action
  8. 8. Expresiones Lambda Funciones como valores/parmetros List inventory = ... //Separar manzanas por color o peso List greenApples = filterApples(inventory, "green", 0, true); List heavyApples = filterApples(inventory, "", 150, false); ... Con el anterior mtodo, podramos escribir cdigo que nos permita realizar el filtrado de nuestras manzanas de la siguiente manera... Cdigo tomado del libro Java 8 in Action
  9. 9. Expresiones Lambda Funciones como valores/parmetros Predicado: Funcin que retorna un resultado booleano Podemos crear una capa de abstraccin para modelar los criterios de bsqueda. Pros Mtodo filtrar sera genrico Cons Eventualmente muchas clases Patrn de diseo Estrategia ApplePredicate +test(Apple):boolean AppleGreenColorPredicate AppleRedColorPredicate AppleHeavyWeightPredicateAppleRedAndHeavyPredicate +test(Apple):boolean +test(Apple):boolean +test(Apple):boolean +test(Apple):boolean
  10. 10. Expresiones Lambda Funciones como valores/parmetros public class AppleHeavyWeightPredicate implements ApplePredicate{ public boolean test(Apple apple){ return apple.getWeight() > 150; } } public class AppleGreenColorPredicate implements ApplePredicate{ public boolean test(Apple apple){ return "green".equals(apple.getColor()); } } Con este nivel de abstraccin, tendramos que crear una clase por cada criterio que deseemos... Cdigo tomado del libro Java 8 in Action
  11. 11. Expresiones Lambda Funciones como valores/parmetros public static List filterApples(List inventory, ApplePredicate p){ List result = new ArrayList(); for(Apple apple: inventory){ if(p.test(apple)){ result.add(apple); } } return result; } Con este nivel de abstraccin, solo tendramos que preocuparnos de que la condicin de nuestro predicado se cumpla... Cdigo tomado del libro Java 8 in Action Nuestro predicado encapsula la condicin
  12. 12. Expresiones Lambda Funciones como valores/parmetros List inventory = ... //Separar manzanas por color List greenApples = filterApples(inventory, new AppleGreenColorPredicate()); //Separar manzanas por peso List heavyApples = filterApples(inventory, new AppleHeavyWeightPredicate()); ... Con el anterior mtodo y nuestro nivel de abstraccin, podramos escribir cdigo que nos permita realizar el filtrado de nuestras manzanas de la siguiente manera... Cdigo tomado del libro Java 8 in Action public boolean test(Apple apple){ return apple.getWeight() > 150; }
  13. 13. Expresiones Lambda Funciones como valores/parmetros List redApples = filterApples(inventory, new ApplePredicate() { public boolean test(Apple apple){ return "red".equals(apple.getColor()); } }); List greenApples = filterApples(inventory, new ApplePredicate() { public boolean test(Apple apple){ return "green".equals(apple.getColor()); } }); Sin embargo, tendramos que tener muchas clases para nuestros predicados y eso va en contra del principio DRY. Java ofrece un mecanismo con el cul podemos declarar e instanciar clases al tiempo... Cdigo tomado del libro Java 8 in Action Enredado, cdigo repetido, etc
  14. 14. Expresiones Lambda Funciones como valores/parmetros List inventory = List redApples = filterApples(inventory, (Apple a) -> "red".equals(apple.getColor()); List greenApples = filterApples(inventory, (Apple a) -> "green".equals(apple.getColor())); En cambio, con expresiones Lambda, podemos pasar funciones como valores/parmetros y nuestro cdigo lucir mucho ms limpio y conciso Cdigo tomado del libro Java 8 in Action Parametrizacin de comportamiento
  15. 15. Expresiones Lambda Definicin Mtodos annimos, es decir, mtodos sin nombre o clase. Paquete java.util.function Permite escribir cdigo ms claro que usar clases annimas. (parmetros) -> {cuerpo expresin lambda} Operador lambda
  16. 16. Expresiones Lambda Definicin Ejemplos de expresiones lambda: (int a, int b) -> a + b (int a) -> a + 1 (int a, int b) -> { System.out.println(a + b); return a + b; } El cuerpo puede lanzar excepciones Una sola lnea no requiere llaves ni la sentencia return Varias lneas requieren separador punto y coma (;) Un solo parmetro no requiere parntesis Ningn parmetro requiere parntesis vacos Parmetros Cuerpo Operador lambda
  17. 17. Expresiones Lambda Definiciones Interfaces Recargadas - Mtodos por Defecto Llamados Mtodos por Defecto, Mtodos Virtuales o Mtodos Defensores Especificados e implementados en la Interface. La implementacin por defecto es usada solo cuando la clase implementadora no provee su propia implementacin Desde el punto de vista de quin invoca al mtodo, es un mtodo ms de la Interface. Especial cuidado cuando se implementen Interfaces con mtodos por defecto iguales public interface MorningInterface { default void saludo(){ System.out.println("Buenos das"); } } public interface AfternoonInterface { default void saludo(){ System.out.println("Buenas tardes"); } } Interface List { default void sort(Comparator