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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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