[Codemotion 2015] patrones de diseño con java8
-
Upload
alonso-torres -
Category
Technology
-
view
2.629 -
download
0
Transcript of [Codemotion 2015] patrones de diseño con java8
![Page 1: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/1.jpg)
Alonso Torres @alotor
Design Patterns
![Page 2: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/2.jpg)
![Page 3: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/3.jpg)
“ ”
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/4.jpg)
Los patrones definen:
soluciones a problemas frecuentes
![Page 5: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/5.jpg)
¿ ?
Son las soluciones con Java 8 las mismas que con versiones anteriores
![Page 6: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/6.jpg)
λ
![Page 7: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/7.jpg)
Alonso Torres@alotor
mobro.co/alotor
![Page 8: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/8.jpg)
El camino hacia
![Page 9: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/9.jpg)
1996
![Page 10: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/10.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/11.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/12.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/13.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/14.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/15.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/16.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/17.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/18.jpg)
Java 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 19: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/19.jpg)
Java 8
● Lambda expressions● Functional interfaces
● Default methods
● Streams
![Page 20: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/20.jpg)
Las lambdas son lo mejor que le ha pasado a Java desde….
![Page 21: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/21.jpg)
Las lambdas son lo mejor que le ha pasado a Java.
![Page 22: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/22.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/23.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/24.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/25.jpg)
Fortran
C
Ada
Cobol
![Page 26: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/26.jpg)
Fortran 1957
C 1969
Ada 1977
Cobol 1989
![Page 27: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/27.jpg)
![Page 28: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/28.jpg)
15%
20%
![Page 29: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/29.jpg)
![Page 30: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/30.jpg)
Features
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 31: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/31.jpg)
Lambdas: funciones anónimas
![Page 32: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/32.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/33.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/34.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/35.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/36.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/37.jpg)
(parameters) -> body;
![Page 38: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/38.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/39.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/40.jpg)
Thread th = new Thread(() ->
System.out.println(">> Another thread"));
th.start();
Creando hilos
![Page 41: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/41.jpg)
Me váis a llamar loco pero…
![Page 42: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/42.jpg)
…en ocasiones veo patrones
![Page 43: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/43.jpg)
Thread th = new Thread(() ->
System.out.println(">> Another thread"));
th.start();
Creando hilos
![Page 44: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/44.jpg)
Client Invoker
Receiver
+action()
ConcreteCommand
+execute()
Command
+execute()
![Page 45: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/45.jpg)
CommandPATRÓN
![Page 46: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/46.jpg)
new Invoker().addCommand(new Command() {
@Override
public void execute() {
receiver.action();
}
});
![Page 47: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/47.jpg)
new Transaction().doWithTransaction(new Command() {
@Override
public void execute() {
myBusinessLogic.calculateInterests();
}
});
![Page 48: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/48.jpg)
new Context().doAsync(new Command() {
@Override
public void execute() {
networkManager.downloadFile();
}
});
![Page 49: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/49.jpg)
Client Invoker
Receiver
+action()
ConcreteCommand
+execute()
Command
+execute()
![Page 50: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/50.jpg)
Client Invoker
Receiver
+action()
ConcreteCommand
+execute()
Command
+execute()
Lambda
![Page 51: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/51.jpg)
new Invoker().addCommand(new Command() {
@Override
public void execute() {
receiver.action();
}
});
![Page 52: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/52.jpg)
new Invoker().addCommand(new Command() {
@Override
public void execute() {
receiver.action();
}
});
![Page 53: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/53.jpg)
new Invoker().addCommand(
() -> receiver.action();
);
![Page 54: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/54.jpg)
surely,we
can do
better
![Page 55: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/55.jpg)
new Invoker().addCommand(
receiver::action
);
Method Reference
![Page 56: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/56.jpg)
Method Reference:Transformar un método en una lambda
![Page 57: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/57.jpg)
() -> receiver.action()
(el) -> el.toString()
() -> Runtime.getInstance()
() -> new Receiver()
![Page 58: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/58.jpg)
() -> receiver.action()
(el) -> el.toString()
() -> Runtime.getInstance()
() -> new Receiver()
![Page 59: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/59.jpg)
() -> 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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/60.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/61.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/62.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/63.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/64.jpg)
Client Invoker
Receiver
+action()
ConcreteCommand
+execute()
Command
+execute()
![Page 65: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/65.jpg)
Client Invoker
Receiver
+action()
ConcreteCommand
+execute()
Command
+execute()
![Page 66: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/66.jpg)
Client Invoker
Receiver
+action()
Command
+execute()
![Page 67: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/67.jpg)
![Page 68: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/68.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/69.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/70.jpg)
The target type of this expression must be a
functional interface
![Page 71: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/71.jpg)
Java 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 72: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/72.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/73.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/74.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/75.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/76.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/77.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/78.jpg)
PROBLEMA
Sólo funciona con interfaces
● NO pueden ser clases
● NI clases abstractas
![Page 79: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/79.jpg)
Java 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 80: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/80.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/81.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/82.jpg)
Java 8 viene con las interfaces más comunes
DE SERIE
![Page 83: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/83.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/84.jpg)
(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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/85.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/86.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/87.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/88.jpg)
Thread th = new Thread(() ->
System.out.println(">> Another thread"));
th.start();
java.lang.Runnable
![Page 89: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/89.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/90.jpg)
ObserverPATRÓN
![Page 91: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/91.jpg)
ConcreteObserverA
+notify()
ConcreteObserverB
+notify()
Observer
+notify()
ObservedClass
+registerObserver()+unregisterObserver()+notifyObservers()
Functional Interface
Lambdas!
![Page 92: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/92.jpg)
@FunctionalInterface
public static interface Observer {
public void notify(Object change);
}
![Page 93: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/93.jpg)
@FunctionalInterface
public static interface Observer {
public void notify(Object change);
}
![Page 94: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/94.jpg)
@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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/95.jpg)
@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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/96.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/97.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/98.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/99.jpg)
observed.addObserver((change) -> {
new Thread(UIThread::update).start()
});
sbj.notifyChange("Change");
![Page 100: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/100.jpg)
![Page 101: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/101.jpg)
Hipótesis
¿Puede haber un patrón de más alto nivel?
![Page 102: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/102.jpg)
new Invoker().addCommand(receiver::action);
observed.addObserver(receiver::action);
![Page 103: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/103.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/104.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/105.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/106.jpg)
StrategyPATRÓN
![Page 107: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/107.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/108.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/109.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/110.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/111.jpg)
Java 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 112: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/112.jpg)
Java 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 113: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/113.jpg)
IteratorPATRÓN
![Page 114: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/114.jpg)
for (String str : list) {
System.out.println(str);
}
![Page 115: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/115.jpg)
for (String str : list) {
if (str.length <= 5) {
System.out.println(str);
}
}
![Page 116: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/116.jpg)
for (String str : Collections.sort(list)) {
if (str.length <= 5) {
System.out.println(str);
}
}
![Page 117: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/117.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/118.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/119.jpg)
Problemas
● Susceptible a errores
● Difícil de razonar
● Difícil de reutilizar
![Page 120: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/120.jpg)
Streams
● Interfaz fluida
● Evaluación perezosa
● Iterable
● Aprovechan toda la expresividad de las lambdas
![Page 121: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/121.jpg)
list.stream()
.forEach(System.out::println);
![Page 122: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/122.jpg)
list.stream()
.filter(s -> s.length <= 5)
.forEach(System.out::println);
![Page 123: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/123.jpg)
list.stream()
.filter(s -> s.length <= 5)
.sorted()
.forEach(System.out::println);
![Page 124: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/124.jpg)
list.stream()
.filter(s -> s.length <= 5)
.sorted()
.limit(10)
.forEach(System.out::println);
![Page 125: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/125.jpg)
list.parallelStream()
.filter(s -> s.length <= 5)
.sorted()
.limit(10)
.forEach(System.out::println);
![Page 126: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/126.jpg)
Funciones importantes
● Map
● Filter
● Reduce
![Page 127: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/127.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/128.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/129.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/130.jpg)
Chain of responsibility
PATRÓN
![Page 131: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/131.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
![Page 132: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/132.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
![Page 133: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/133.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
![Page 134: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/134.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
![Page 135: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/135.jpg)
@FunctionalInterfacepublic interface Handler { public Request handleRequest(Request req);}
![Page 136: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/136.jpg)
@FunctionalInterfacepublic interface Handler extends Function<Request, Request> {}
![Page 137: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/137.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/138.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/139.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/140.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/141.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
![Page 142: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/142.jpg)
HANDLER HANDLER HANDLER HANDLER HANDLERrequest
CHAIN (HANDLER)
![Page 143: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/143.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/144.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/145.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/146.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/147.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/148.jpg)
¯\_(ツ)_/¯
![Page 149: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/149.jpg)
Java SE 8
● Lambda expressions
● Functional interfaces
● Default methods
● Streams
![Page 150: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/150.jpg)
Patrones
● Command
● Strategy
● Observer
● Iterator
● Chain of responsibility
![Page 151: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/151.jpg)
Los patrones definen:
soluciones a problemas frecuentes
![Page 152: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/152.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/153.jpg)
Las lambdas son lo mejor que le ha pasado a Java.
![Page 154: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/154.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/155.jpg)
@alotor
mobro.co/alotor
¿Preguntas?
@alotor
![Page 156: [Codemotion 2015] patrones de diseño con java8](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/156.jpg)
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](https://reader033.fdocumento.com/reader033/viewer/2022050613/58ad8e351a28ab662a8b5e5b/html5/thumbnails/157.jpg)
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