[codemotion 2015] patrones de diseño con java8

157
Alonso Torres @alotor Design Patterns

Upload: alonso-torres

Post on 22-Jan-2018

2.627 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: [Codemotion 2015] patrones de diseño con java8

Alonso Torres @alotor

Design Patterns

Page 2: [Codemotion 2015] patrones de diseño con java8
Page 3: [Codemotion 2015] patrones de diseño con java8

“ ”

Cada patrón describe un problema recurrente en nuestro entorno, así como la solución a ese problema, de tal modo que se pueda aplicar esta solución un millón de veces, sin hacer lo mismo dos veces.

- Christopher Alexander, A Pattern Language

Page 4: [Codemotion 2015] patrones de diseño con java8

Los patrones definen:

soluciones a problemas frecuentes

Page 5: [Codemotion 2015] patrones de diseño con java8

¿ ?

Son las soluciones con Java 8 las mismas que con versiones anteriores

Page 6: [Codemotion 2015] patrones de diseño con java8

λ

Page 7: [Codemotion 2015] patrones de diseño con java8

Alonso Torres@alotor

mobro.co/alotor

Page 8: [Codemotion 2015] patrones de diseño con java8

El camino hacia

Page 9: [Codemotion 2015] patrones de diseño con java8

1996

Page 10: [Codemotion 2015] patrones de diseño con java8

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 11: [Codemotion 2015] patrones de diseño con java8

1994

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 12: [Codemotion 2015] patrones de diseño con java8

1998 - J2SE 1.2

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Adopción masiva del

lenguaje

Page 13: [Codemotion 2015] patrones de diseño con java8

2004 - J2SE 5.0

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

GenéricosAnotacionesEnumeradosNueva sintaxisConcurrencia

Page 14: [Codemotion 2015] patrones de diseño con java8

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 15: [Codemotion 2015] patrones de diseño con java8

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 16: [Codemotion 2015] patrones de diseño con java8

2011 - Java SE 7

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

InvokeDynamicNIO 2Nueva concurrencia

Page 17: [Codemotion 2015] patrones de diseño con java8

2014 - Java SE 8

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 18: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 19: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions● Functional interfaces

● Default methods

● Streams

Page 20: [Codemotion 2015] patrones de diseño con java8

Las lambdas son lo mejor que le ha pasado a Java desde….

Page 21: [Codemotion 2015] patrones de diseño con java8

Las lambdas son lo mejor que le ha pasado a Java.

Page 22: [Codemotion 2015] patrones de diseño con java8

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 23: [Codemotion 2015] patrones de diseño con java8

C#

1990 1995 2000 2005 2010 2015

1.0 1.2 1.4 5 6 7 81.3

Page 24: [Codemotion 2015] patrones de diseño con java8

ActionScript Groovy Perl

C# Haskell PHP

C++ JavaScript Python

Clojure Lisp R

Curl Logtalk Racket

D Lua Ruby

Dart Mathematica Scala

Dylan Maple Scheme

Erlang Matlab Smalltalk

Elixir Maxima Standard ML

F# OCaml TypeScript

Go Object Pascal Tcl

Gosu Objective-C VisualBasic .NET

Page 25: [Codemotion 2015] patrones de diseño con java8

Fortran

C

Ada

Cobol

Page 26: [Codemotion 2015] patrones de diseño con java8

Fortran 1957

C 1969

Ada 1977

Cobol 1989

Page 27: [Codemotion 2015] patrones de diseño con java8
Page 28: [Codemotion 2015] patrones de diseño con java8

15%

20%

Page 29: [Codemotion 2015] patrones de diseño con java8
Page 30: [Codemotion 2015] patrones de diseño con java8

Features

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 31: [Codemotion 2015] patrones de diseño con java8

Lambdas: funciones anónimas

Page 32: [Codemotion 2015] patrones de diseño con java8

public Integer addition(Integer x, Integer y) {

return x + y;

}

public void sayHello(String name) {

System.out.println("Hello " + name);

}

public Float giveMePi() {

return 3.15f;

}

Page 33: [Codemotion 2015] patrones de diseño con java8

public Integer addition(Integer x, Integer y) {

return x + y;

}

public void sayHello(String name) {

System.out.println("Hello " + name);

}

public Float giveMePi() {

return 3.15f;

}

Page 34: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> {

return x + y;

};

(String name) -> {

System.out.println("Hello" + name);

};

() -> {

return 3.15f;

};

Page 35: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> {

System.out.println("Hello" + name);

};

() -> 3.15f

Page 36: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> {

System.out.println("Hello" + name);

};

() -> 3.15f

PARÁMETROS CUERPO

Page 37: [Codemotion 2015] patrones de diseño con java8

(parameters) -> body;

Page 38: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> System.out.println("Hello" + name);

() -> 3.15f

Page 39: [Codemotion 2015] patrones de diseño con java8

Thread th = new Thread(new Runnable(){

@Override

public void run() {

System.out.println(">> Another thread"));

}

});

th.start();

Creando hilos

Page 40: [Codemotion 2015] patrones de diseño con java8

Thread th = new Thread(() ->

System.out.println(">> Another thread"));

th.start();

Creando hilos

Page 41: [Codemotion 2015] patrones de diseño con java8

Me váis a llamar loco pero…

Page 42: [Codemotion 2015] patrones de diseño con java8

…en ocasiones veo patrones

Page 43: [Codemotion 2015] patrones de diseño con java8

Thread th = new Thread(() ->

System.out.println(">> Another thread"));

th.start();

Creando hilos

Page 44: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

ConcreteCommand

+execute()

Command

+execute()

Page 45: [Codemotion 2015] patrones de diseño con java8

CommandPATRÓN

Page 46: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(new Command() {

@Override

public void execute() {

receiver.action();

}

});

Page 47: [Codemotion 2015] patrones de diseño con java8

new Transaction().doWithTransaction(new Command() {

@Override

public void execute() {

myBusinessLogic.calculateInterests();

}

});

Page 48: [Codemotion 2015] patrones de diseño con java8

new Context().doAsync(new Command() {

@Override

public void execute() {

networkManager.downloadFile();

}

});

Page 49: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

ConcreteCommand

+execute()

Command

+execute()

Page 50: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

ConcreteCommand

+execute()

Command

+execute()

Lambda

Page 51: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(new Command() {

@Override

public void execute() {

receiver.action();

}

});

Page 52: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(new Command() {

@Override

public void execute() {

receiver.action();

}

});

Page 53: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(

() -> receiver.action();

);

Page 54: [Codemotion 2015] patrones de diseño con java8

surely,we

can do

better

Page 55: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(

receiver::action

);

Method Reference

Page 56: [Codemotion 2015] patrones de diseño con java8

Method Reference:Transformar un método en una lambda

Page 57: [Codemotion 2015] patrones de diseño con java8

() -> receiver.action()

(el) -> el.toString()

() -> Runtime.getInstance()

() -> new Receiver()

Page 58: [Codemotion 2015] patrones de diseño con java8

() -> receiver.action()

(el) -> el.toString()

() -> Runtime.getInstance()

() -> new Receiver()

Page 59: [Codemotion 2015] patrones de diseño con java8

() -> receiver.action() receiver::action

(el) -> el.toString() Object::toString

() -> Runtime.getInstance() Runtime::getInstance

() -> new Receiver() Reciver::new

Page 60: [Codemotion 2015] patrones de diseño con java8

Instance method reference

(objeto concreto)

Instance method reference

(cualquier objeto)

Static method reference

Constructor reference

receiver::action

Object::toString

Runtime::getInstance

Reciver::new

Page 61: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) ->

receiver.action(x, y)

(Integer x, Integer y) ->

Math.max(x, y)

(String str) ->

new String(str)

Page 62: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) ->

receiver.action(x, y)receiver::action

(Integer x, Integer y) ->

Math.max(x, y)

Math::max

(String str) ->

new String(str)String::new

Page 63: [Codemotion 2015] patrones de diseño con java8

new Transaction().doWithTransaction(

myBusinessLogic::calculateInterests

);

new ThreadPool().doInThread(

networkManager::downloadFile

);

new Transaction().doWithTransaction(

networkManager::downloadFile

);

new ThreadPool().doInThread(

myBusinessLogic::calculateInterests

);

Page 64: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

ConcreteCommand

+execute()

Command

+execute()

Page 65: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

ConcreteCommand

+execute()

Command

+execute()

Page 66: [Codemotion 2015] patrones de diseño con java8

Client Invoker

Receiver

+action()

Command

+execute()

Page 67: [Codemotion 2015] patrones de diseño con java8
Page 68: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> System.out.println("Hello" + name);

() -> 3.15f

¿Qué TIPO tienen las lambdas?

Page 69: [Codemotion 2015] patrones de diseño con java8

Object addition =

(Integer x, Integer y) -> x + y;

Object sayHello =

(String name) -> System.out.println("Hello" + name);

Object giveMePi =

() -> 3.15f

¿Qué TIPO tienen las lambdas?

Page 70: [Codemotion 2015] patrones de diseño con java8

The target type of this expression must be a

functional interface

Page 71: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 72: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> System.out.println("Hello" + name);

() -> 3.15f

Page 73: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> System.out.println("Hello" + name);

() -> 3.15f

Integer addition(Integer x, Integer y)

void sayHello(String name)

Float giveMePi()

Page 74: [Codemotion 2015] patrones de diseño con java8

Functional interfaces

public interface Addition {

Integer addition(Integer x, Integer y);

}

public interface SayHello {

void sayHello(String name);

}

public interface GiveMePi {

Float giveMePi();

}

Page 75: [Codemotion 2015] patrones de diseño con java8

Functional interfaces

public interface Addition {

public Integer addition(Integer x, Integer y);

}

1 sólo método

Page 76: [Codemotion 2015] patrones de diseño con java8

Functional interfaces

public interface Addition {

public Integer addition(Integer x, Integer y);

}

Addition addition =

(Integer x, Integer y) -> x + y;

Page 77: [Codemotion 2015] patrones de diseño con java8

public interface Addition {

public Integer addition(Integer x, Integer y);

}

public interface Operation<T extends Number> {

public T do(T x, T y);

}

Operation<Integer> addition =

(Integer x, Integer y) -> x + y;

Page 78: [Codemotion 2015] patrones de diseño con java8

PROBLEMA

Sólo funciona con interfaces

● NO pueden ser clases

● NI clases abstractas

Page 79: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 80: [Codemotion 2015] patrones de diseño con java8

Default Methods

public interface Addition {

public Integer addition(Integer x, Integer y);

default Integer substraction(Integer x, Integer y) {

return addition(x, -y);

}

}

Page 81: [Codemotion 2015] patrones de diseño con java8

public interface Addition {

public Integer addition(Integer x, Integer y);

}

Addition addition =

(Integer x, Integer y) -> x + y;

Si tenemos que definir una “Functional Interface” por cada lambda...

¿Qué hemos ganado?

Page 82: [Codemotion 2015] patrones de diseño con java8

Java 8 viene con las interfaces más comunes

DE SERIE

Page 83: [Codemotion 2015] patrones de diseño con java8

import java.util.function.*

BiConsumer<T,U> IntBinaryOperator LongUnaryOperator

BiFunction<T,U,R> IntConsumer ObjDoubleConsumer<T>

BinaryOperator<T> IntFunction<R> ObjIntConsumer<T>

BiPredicate<T,U> IntPredicate ObjLongConsumer<T>

BooleanSupplier IntSupplier Predicate<T>

Consumer<T> IntToDoubleFunction Supplier<T>

DoubleBinaryOperator IntToLongFunction ToDoubleBiFunction<T,U>

DoubleConsumer IntUnaryOperator ToDoubleFunction<T>

DoubleFunction<R> LongBinaryOperator ToIntBiFunction<T,U>

DoublePredicate LongConsumer ToIntFunction<T>

DoubleSupplier LongFunction<R> ToLongBiFunction<T,U>

DoubleToIntFunction LongPredicate ToLongFunction<T>

DoubleToLongFunction LongSupplier UnaryOperator<T>

DoubleUnaryOperator LongToDoubleFunction

Function<T,R> LongToIntFunction

Page 84: [Codemotion 2015] patrones de diseño con java8

(Integer x, Integer y) -> x + y;

(String name) -> System.out.println("Hello" + name);

() -> 3.15f

¿Qué TIPO tienen?

public Integer addition(Integer x, Integer y)

public void sayHello(String name)

public Float giveMePi()

Page 85: [Codemotion 2015] patrones de diseño con java8

BiConsumer<T,U> IntBinaryOperator LongUnaryOperator

BiFunction<T,U,R> IntConsumer ObjDoubleConsumer<T>

BinaryOperator<T> IntFunction<R> ObjIntConsumer<T>

BiPredicate<T,U> IntPredicate ObjLongConsumer<T>

BooleanSupplier IntSupplier Predicate<T>

Consumer<T> IntToDoubleFunction Supplier<T>

DoubleBinaryOperator IntToLongFunction ToDoubleBiFunction<T,U>

DoubleConsumer IntUnaryOperator ToDoubleFunction<T>

DoubleFunction<R> LongBinaryOperator ToIntBiFunction<T,U>

DoublePredicate LongConsumer ToIntFunction<T>

DoubleSupplier LongFunction<R> ToLongBiFunction<T,U>

DoubleToIntFunction LongPredicate ToLongFunction<T>

DoubleToLongFunction LongSupplier UnaryOperator<T>

DoubleUnaryOperator LongToDoubleFunction

Function<T,R> LongToIntFunction

import java.util.function.*

Page 86: [Codemotion 2015] patrones de diseño con java8

BinaryOperator<Integer> addition =

(Integer x, Integer y) -> x + y;

Consumer<String> sayHi =

(String name) -> System.out.println("Hello" + name);

Supplier<Float> giveMePi =

() -> 3.15f

Page 87: [Codemotion 2015] patrones de diseño con java8

BinaryOperator<Integer> addition =

(x, y) -> x + y;

Consumer<String> sayHi =

(name) -> System.out.println("Hello" + name);

Supplier<Float> giveMePi =

() -> 3.15f

Page 88: [Codemotion 2015] patrones de diseño con java8

Thread th = new Thread(() ->

System.out.println(">> Another thread"));

th.start();

java.lang.Runnable

Page 89: [Codemotion 2015] patrones de diseño con java8

JButton button = new JButton("Button");

button.addActionListener((event) ->

System.out.println("Mouse: " + event);

);

java.awt.ActionListener

Page 90: [Codemotion 2015] patrones de diseño con java8

ObserverPATRÓN

Page 91: [Codemotion 2015] patrones de diseño con java8

ConcreteObserverA

+notify()

ConcreteObserverB

+notify()

Observer

+notify()

ObservedClass

+registerObserver()+unregisterObserver()+notifyObservers()

Functional Interface

Lambdas!

Page 92: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterface

public static interface Observer {

public void notify(Object change);

}

Page 93: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterface

public static interface Observer {

public void notify(Object change);

}

Page 94: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterface

public static interface Observer {

public void notify(Object change);

}

El compilador fallará si no cumple con las condiciones de una FI.

Page 95: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterface

public static interface Observer {

public void notify(Object change);

}

El compilador fallará si no cumple con las condiciones de una FI.

Tu yo del futuro te lo agradecerá

Page 96: [Codemotion 2015] patrones de diseño con java8

public static class ObservedClass {

private List<Observer> observers = new LinkedList<>();

public void addObserver(Observer observer) {

observers.add(observer);

}

public void removeObserver(Observer observer) {

observers.remove(observer);

}

public void notifyChange(Object change) {

observers.forEach((o) -> o.notify(change));

}

}

Page 97: [Codemotion 2015] patrones de diseño con java8

public static class ObservedClass {

private List<Observer> observers = new LinkedList<>();

public void addObserver(Observer observer) {

observers.add(observer);

}

public void removeObserver(Observer observer) {

observers.remove(observer);

}

public void notifyChange(Object change) {

observers.forEach((o) -> o.notify(change));

}

}

Una estructura de datos que guarda lambdas.

Page 98: [Codemotion 2015] patrones de diseño con java8

public static class ObservedClass {

private List<Observer> observers = new LinkedList<>();

public void addObserver(Observer observer) {

observers.add(observer);

}

public void removeObserver(Observer observer) {

observers.remove(observer);

}

public void notifyChange(Object change) {

observers.forEach((o) -> o.notify(change));

}

}

Nuevo método de Java 8

Page 99: [Codemotion 2015] patrones de diseño con java8

observed.addObserver((change) -> {

new Thread(UIThread::update).start()

});

sbj.notifyChange("Change");

Page 100: [Codemotion 2015] patrones de diseño con java8
Page 101: [Codemotion 2015] patrones de diseño con java8

Hipótesis

¿Puede haber un patrón de más alto nivel?

Page 102: [Codemotion 2015] patrones de diseño con java8

new Invoker().addCommand(receiver::action);

observed.addObserver(receiver::action);

Page 103: [Codemotion 2015] patrones de diseño con java8

Pasar comportamiento como argumentos

● El comportamiento se ejecutará en otro contexto

● “Separation of concerns”

● También conocido como: High Order Functions

new Invoker().addCommand(receiver::action);

observed.addObserver(receiver::action);

Page 104: [Codemotion 2015] patrones de diseño con java8

List<Person> personList = new LinkedList<>();

Collections.sort(

personList,

(p1, p2) -> p1.age - p2.age

);

java.lang.Comparable<T>

Page 105: [Codemotion 2015] patrones de diseño con java8

List<Person> personList = new LinkedList<>();

Collections.sort(

personList,

(p1, p2) -> p1.age - p2.age

);

java.lang.Comparable<T>

DATOS

COMPORTAMIENTO

Page 106: [Codemotion 2015] patrones de diseño con java8

StrategyPATRÓN

Page 107: [Codemotion 2015] patrones de diseño con java8

Collections.sort( list, (p1, p2) -> p1.getAge() - p2.getAge());

Collections.sort( list, (p1, p2) -> p1.getName().compareTo(p2.getName()));

Collections.sort( list, (p1, p2) -> -p1.getName().compareTo(p2.getName()));

Page 108: [Codemotion 2015] patrones de diseño con java8

Reusing lambdas

class PersonSortCriterias {

public static int sortByAge(Person p1, Person p2) {

return p1.getAge() - p2.getName();

}

public static int sortByName(Person p1, Person p2) {

return p1.getName().compareTo(p2.getName());

}

public static int sortByNameReverse(Person p1, Person p2) {

return -p1.getName().compareTo(p2.getName());

}

}

Page 109: [Codemotion 2015] patrones de diseño con java8

Collections.sort( list, PersonSortCriterias::sortByAge);

Collections.sort( list, PersonSortCriterias::sortByName);

Collections.sort( list, PersonSortCriterias::sortByNameReverse);

Page 110: [Codemotion 2015] patrones de diseño con java8

Set<Person> = new TreeSet<>( PersonSortCriterias::sortByAge);

Person theOlder = Collections.max( list, PersonSortCriterias::sortByAge);

list.sort(PersonSortCriterias::sortByAge);

Page 111: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 112: [Codemotion 2015] patrones de diseño con java8

Java 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 113: [Codemotion 2015] patrones de diseño con java8

IteratorPATRÓN

Page 114: [Codemotion 2015] patrones de diseño con java8

for (String str : list) {

System.out.println(str);

}

Page 115: [Codemotion 2015] patrones de diseño con java8

for (String str : list) {

if (str.length <= 5) {

System.out.println(str);

}

}

Page 116: [Codemotion 2015] patrones de diseño con java8

for (String str : Collections.sort(list)) {

if (str.length <= 5) {

System.out.println(str);

}

}

Page 117: [Codemotion 2015] patrones de diseño con java8

for (String str : Collections.sort(list).sublist(0, 10)) {

if (str.length <= 5) {

System.out.println(str);

}

}

Page 118: [Codemotion 2015] patrones de diseño con java8

for (String str : Collections.sort(list).sublist(0, 10)) {

if (str.length <= 5) {

System.out.println(str.toUpperCase());

}

}

Page 119: [Codemotion 2015] patrones de diseño con java8

Problemas

● Susceptible a errores

● Difícil de razonar

● Difícil de reutilizar

Page 120: [Codemotion 2015] patrones de diseño con java8

Streams

● Interfaz fluida

● Evaluación perezosa

● Iterable

● Aprovechan toda la expresividad de las lambdas

Page 121: [Codemotion 2015] patrones de diseño con java8

list.stream()

.forEach(System.out::println);

Page 122: [Codemotion 2015] patrones de diseño con java8

list.stream()

.filter(s -> s.length <= 5)

.forEach(System.out::println);

Page 123: [Codemotion 2015] patrones de diseño con java8

list.stream()

.filter(s -> s.length <= 5)

.sorted()

.forEach(System.out::println);

Page 124: [Codemotion 2015] patrones de diseño con java8

list.stream()

.filter(s -> s.length <= 5)

.sorted()

.limit(10)

.forEach(System.out::println);

Page 125: [Codemotion 2015] patrones de diseño con java8

list.parallelStream()

.filter(s -> s.length <= 5)

.sorted()

.limit(10)

.forEach(System.out::println);

Page 126: [Codemotion 2015] patrones de diseño con java8

Funciones importantes

● Map

● Filter

● Reduce

Page 127: [Codemotion 2015] patrones de diseño con java8

MAP - FILTER - REDUCE

list.stream()

.map(String::toUpperCase)

"banana"

"apple"

"pear"

"pineapple"

"lemon"

"mango"

"raspberry"

"melon"

"BANANA"

"APPLE"

"PEAR"

"PINEAPPLE"

"LEMON"

"MANGO"

"RASPBERRY"

"MELON"

Page 128: [Codemotion 2015] patrones de diseño con java8

MAP - FILTER - REDUCE

list.stream()

.filter(s -> s.length <= 5)

"banana"

"apple"

"pear"

"pineapple"

"lemon"

"mango"

"raspberry"

"melon"

"apple"

"pear"

"lemon"

"mango"

"melon"

Page 129: [Codemotion 2015] patrones de diseño con java8

MAP - FILTER - REDUCE

list.stream()

.reduce("", (acc, elem) -> acc + ", " + elem);

"banana"

"apple"

"pear"

"pineapple"

"lemon"

"mango"

"raspberry"

"melon"

"banana,apple,pear,pineapple,...

Page 130: [Codemotion 2015] patrones de diseño con java8

Chain of responsibility

PATRÓN

Page 131: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

Page 132: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

Page 133: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

Page 134: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

Page 135: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterfacepublic interface Handler { public Request handleRequest(Request req);}

Page 136: [Codemotion 2015] patrones de diseño con java8

@FunctionalInterfacepublic interface Handler extends Function<Request, Request> {}

Page 137: [Codemotion 2015] patrones de diseño con java8

List<Handler> chain = new LinkedList<>();

chain.add(Request::session);

chain.add(Request::securityCheck);

chain.add(Request::cookies);

chain.add(Request::getParameters);

Page 138: [Codemotion 2015] patrones de diseño con java8

List<Handler> chain = new LinkedList<>();

chain.add(Request::session);

chain.add(Request::securityCheck);

chain.add(Request::cookies);

chain.add(Request::getParameters);

Request req = new Request();

Request processed = chain.stream() .reduce(initial value, accumulation function)

Page 139: [Codemotion 2015] patrones de diseño con java8

List<Handler> chain = new LinkedList<>();

chain.add(Request::session);

chain.add(Request::securityCheck);

chain.add(Request::cookies);

chain.add(Request::getParameters);

Request req = new Request();

Request processed = chain.stream() .reduce(req, accumulation function)

Page 140: [Codemotion 2015] patrones de diseño con java8

List<Handler> chain = new LinkedList<>();

chain.add(Request::session);

chain.add(Request::securityCheck);

chain.add(Request::cookies);

chain.add(Request::getParameters);

Request req = new Request();

Request processed = chain.stream() .reduce(req, (old, handler) -> handler.apply(old))

Page 141: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

Page 142: [Codemotion 2015] patrones de diseño con java8

HANDLER HANDLER HANDLER HANDLER HANDLERrequest

CHAIN (HANDLER)

Page 143: [Codemotion 2015] patrones de diseño con java8

List<Handler> filters = new LinkedList<>();

filters.add(Request::session);

filters.add(Request::securityCheck);

filters.add(Request::cookies);

filters.add(Request::getParameters);

Handler filterChain =

filters.stream()

.reduce(

initial value,

accumulation function);

Page 144: [Codemotion 2015] patrones de diseño con java8

List<Handler> filters = new LinkedList<>();

filters.add(Request::session);

filters.add(Request::securityCheck);

filters.add(Request::cookies);

filters.add(Request::getParameters);

Handler filterChain =

filters.stream()

.reduce(

(r) -> r,

accumulation function);

Page 145: [Codemotion 2015] patrones de diseño con java8

List<Handler> filters = new LinkedList<>();

filters.add(Request::session);

filters.add(Request::securityCheck);

filters.add(Request::cookies);

filters.add(Request::getParameters);

Handler filterChain =

filters.stream()

.reduce(

(r) -> r,

(f1, f2) -> f1.andThen(f2));

Page 146: [Codemotion 2015] patrones de diseño con java8

List<Handler> filters = new LinkedList<>();

filters.add(Request::session);

filters.add(Request::securityCheck);

filters.add(Request::cookies);

filters.add(Request::getParameters);

Handler filterChain =

filters.stream()

.reduce(

Function.identity(),

Function::andThen);

Page 147: [Codemotion 2015] patrones de diseño con java8

System.out.println("\nProcessing request 1");

Request r1 = chain.apply(new Request());

System.out.println("\nProcessing request 2");

Request r2 = chain.apply(new Request());

Processing request 1>> process session>> process securityCheck>> process cookies>> process getParameters

Processing request 2>> process session>> process securityCheck>> process cookies>> process getParameters

Page 148: [Codemotion 2015] patrones de diseño con java8

¯\_(ツ)_/¯

Page 149: [Codemotion 2015] patrones de diseño con java8

Java SE 8

● Lambda expressions

● Functional interfaces

● Default methods

● Streams

Page 150: [Codemotion 2015] patrones de diseño con java8

Patrones

● Command

● Strategy

● Observer

● Iterator

● Chain of responsibility

Page 151: [Codemotion 2015] patrones de diseño con java8

Los patrones definen:

soluciones a problemas frecuentes

Page 152: [Codemotion 2015] patrones de diseño con java8

Problema

● El comportamiento y el contexto son diferentes

● Encapsular los datos

● Composición de comportamiento

Solución

● High order functions (Lambdas)

Page 153: [Codemotion 2015] patrones de diseño con java8

Las lambdas son lo mejor que le ha pasado a Java.

Page 154: [Codemotion 2015] patrones de diseño con java8

Sobre los hombros de gigantes

Mario Fusco Venkat Subramaniam Samir Talwarhttps://youtu.be/K6BmGBzIqW0 https://vimeo.com/122645679https://youtu.be/8qcHPEyLkPE

Page 155: [Codemotion 2015] patrones de diseño con java8

@alotor

mobro.co/alotor

¿Preguntas?

@alotor

Page 156: [Codemotion 2015] patrones de diseño con java8

Referencias

● https://en.wikipedia.org/wiki/Java_version_history

● http://www.studytrails.com/java/java8/Java8_Lambdas_FunctionalProgramming.jsp

● https://blog.idrsolutions.com/2015/02/java-8-method-references-explained-5-minutes/

● http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

● http://www.javaworld.com/article/2078675/core-java/design-patterns--the-big-picture--part-2--gang-

of-four-classics-revisited.html

● http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries

● https://www.questers.com/sites/all/themes/questers/sec_presentation/java8lambdas.html

● http://www.slideshare.net/jaxlondon2012/lambda-a-peek-under-the-hood-brian-goetz

● http://www.infoq.com/presentations/lambda-invokedynamic?

utm_source=infoq&utm_medium=videos_homepage&utm_campaign=videos_row1

● http://www.slideshare.net/DaewonJeong/scala-is-java8next

● http://programmers.stackexchange.com/questions/173441/what-triggered-the-popularity-of-lambda-

functions-in-modern-mainstream-programmi

● http://www.infoq.com/presentations/A-Brief-History-of-the-Java-World

Page 157: [Codemotion 2015] patrones de diseño con java8

Referencias

● http://j2objc.org/blog/2015/08/07/lambdas-in-java-8-dysfunctional-interfaces.html

● http://gafter.blogspot.com.es/2006/08/closures-for-java.html

● http://www.javaworld.com/article/2077569/core-java/java-tip-68--learn-how-to-implement-the-

command-pattern-in-java.html

● http://www.slideshare.net/mariofusco/fp-in-java-project-lambda-and-beyond?qid=11ae9463-c2e3-

4c54-842f-b228ce109200&v=default&b=&from_search=12

● http://www.norvig.com/design-patterns/design-patterns.pdf

● http://www.techempower.com/blog/2013/03/26/everything-about-java-8/

● http://www.oracle.com/technetwork/server-storage/ts-4961-159222.pdf

● http://talks.samirtalwar.com/design-patterns-in-the-21st-century.html