SlideShare una empresa de Scribd logo
#BarCampRD2015
28 Noviembre 2015, PUCMM, Santiago de los caballeros, R. D.
EUDRIS CABRERA
@eudriscabrera
Más allá de las
Expresiones
Lambda
@ecabrerar
@eudriscabrera
BarCampRD Java Dominicano CodeCamp SDQ 4.0
● Ingeniero Telemático (PUCMM).
○ Desarrollador Informático / PAFI - Ministerio de
Hacienda, R. D.
○ Entusiasta de la tecnología y el software libre.
○ Ganador de la beca Linux Training Scholarship
2014 categoría Developer Do-Gooder.
● Eventos
Eudris Cabrera
AGENDA
● Breve Reseña sobre Java
● Java 8
● Expresiones Lambda
● Conceptos Básicos (sobre Programación Funcional)
● Procesando Data con Streams
● Nuevo API de fechas
● Java fue inventado como un lenguaje orientado a
objeto.
● Utiliza una máquina virtual para su ejecución (JVM)
● La plataforma java está dividida en Java SE, Java
EE, Java ME y Javafx
● ~ 2005 con Java 5 se introducen cambios
significativos.
○ Genéricos
○ Loop Mejorado
○ Anotaciones
○ Enumeraciones
○ Mejora para la concurrencia (AtomicInteger)
Breve Reseña sobre Java
James Gosling
Creador de Java
en los años 90's
Popularidad del Lenguaje Java
TIOBE Index lo sitúa en el primer lugar para el mes de Noviembre del 2015.
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Githut Info* lo sitúa en el segundo lugar para el mes de Noviembre del 2015,
muy cercano a Javascript, quien ocupa el primer lugar.
http://githut.info
*Githut Info es un espacio que muestra el uso de los lenguajes de programación dentro de la
plataforma GitHub.
Java SE 8, liberado en marzo del 2014, es la plataforma que
incluye la actualización más grande para el modelo de programación
Java desde el lanzamiento de la plataforma en 1996.
Incluye nuevas funcionalidades e incorpora las características de los
lenguaje funcionales.
Expresiones lambdas
Una expresión lambda representa una
función anónima.
λx → x+x
Función anónima que toma un número x y devuelve el resultado x + x.
Desarrolló en los años 30's
el "Cálculo lambda", un
sistema formal en lógica
matemática diseñado para
investigar la definición de
función, la noción de
aplicación de funciones y la
recursión.
Alonzo Church
Una expresión lambda se compone de un conjunto de
parámetros, un operador lambda (->) y un cuerpo de la
función.
Sintaxis
() -> System.out.println("Hello Lambda")
x -> x + 10
(int x, int y) -> { return x + y; }
(String x, String y) -> x.length() – y.length()
(String x) -> {
listA.add(x);
listB.remove(x);
return listB.size();
}
¿Por qué Java necesita
Expresiones Lambda?
● Java necesitaba cambios para
simplificar la codificación
paralela.
● Es muy útil para evitar tener que
escribir métodos que sólo utilizamos
una vez.
● Simplifica cómo pasar
comportamiento como un parámetro
(podemos pasar expresiones lambda
a métodos como argumentos).
Interfaces Funcionales
En Java, una interfaz funcional es, básicamente, una interfaz con un
único método abstracto.
Este tipo de interfaces también son conocidos como tipos SAM
(Single Abstract Method).
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Runnable r = () -> System.out.println("Hello Lambda");
java.util.function
● Predicate<T> - Recibe un argumento tipo T y retorna un booleano.
● Consumer<T> - una acción que se realiza sobre un objeto
● Function<T,R> - a funcion que transforma un valor T a R
● Supplier<T> - provee una instancia de T (como un factory).
● UnaryOperator<T> - Forma especializada de Function. Recibe un
valor T como argumento y retorna del un valor del mismo tipo T.
● BinaryOperator<T> - Forma especializada de BiFunction. Recibe
dos argumentos y retorna un resultado, todos del mismo tipo.
Method References
Nos permiten utilizar un método como una expresión lambda.
Formato: target_reference::method_name
class Person {
private String name;
private int age;
public int getAge() {return this.age;}
public String getName() {return this.name;}
}
Person[] people = ...;
Comparator<Person> byName = Comparator.comparing(Person::getName);
Arrays.sort(people, byName);
Method References
(Tipos)
● Método estático (ClassName::methName)
● Un método de instancia de un objeto particular (instanceRef::
methName)
● Un método super de un objeto particular (super::methName)
● Un método de instancia de un objeto arbitrario de un tipo particular
(ClassName::methName)
● Un constructor de una clase (ClassName::new)
● Un constructor de un arreglo (TypeName[]::new)
Nuevos métodos útiles en
Java 8 que pueden utilizar Lambdas
Iterable
Iterable.forEach(Consumer c)
Collection
Collection.removeIf(Predicate p)
List
List.replaceAll(UnaryOperator o)
List.sort(Comparator c)
Reemplaza "Collections.sort(List l, Comparator c)"
Metodos Predeterminados("Default")
● Tradicionalmente, las interfaces no pueden tener definiciones de método
(sólo declaraciones).
● Métodos predeterminados (Default) permite realizar implementaciones por
defecto dentro de una interfaz.
public interface A {
default void foo() {
System.out.println("Calling A.foo()");
}
}
public class Clazz implements A {
}
Conceptos básicos
sobre
Programación Funcional
Programación Funcional
Un paradigma de programación donde las funciones son
entidades de primera clase.
¿Qué
significa
eso?
Qué las funciones pueden ser usada de la misma forma que
usamos enteros (integers) o cadenas de caracteres(strings).
Se pueden pasar funciones como parámetros a otras funciones
y pueden ser retornada como resultado de otras funciones.
Programación Funcional
El primer lenguaje ampliamente utilizado para
programación funcional fue Lisp diseñado por John
McCarthy en los años 50's
En las universidades frecuentemente se usa Haskell
para la enseñanza.
Puedes empezar con JavaScript, Python, Scala o Java 8
Logo
de Haskell
¿Por qué utilizar programación funcional?
● Ley de Moore
● Programación Concurrente
● Inmutabilidad -> El estado no cambia
● Facilidad para programar concurrentemente
● Las funciones siempre devuelven el mismo resultado para cada entrada
● Reducción de la cantidad de líneas de código.
● Código más fácil de testear.
Programación Funcional vs Programación Imperativa
❏ Programación imperativa y programación funcional son dos enfoques muy diferentes.
❏ Imperativo.
❏ Se utilizan cambios de estado.
❏ Orden de ejecución se define como un contrato.
❏ La repetición (loop) es explícito y externo.
❏ Efectos de lado.
❏ Mutabilidad.
❏ Funcional.
❏ Se utilizan funciones aritméticas.
❏ Orden de ejecución no se define.
❏ La repetición es a través del uso de la recursión.
❏ No hay efectos de lado.
❏ Inmutabilidad.
Antes de
Java 8
La programación funcional no va a resolver
todos sus problemas de programación.
Es sólo otra herramienta en su arsenal.
Algunos problemas son más fáciles de
resolver utilizando técnicas de
programación funcional.
Otros son más adecuados a la
programación lógica.
Otros se hacen mejor usando programación
orientada a objetos.
Introducción al Stream API
Stream:
● Representa una abstracción para
especificar cálculos agregados
(acumulativos).
● Simplifica la descripción de los cálculos
agregados (laziness,paralelismo).
Elementos de un Stream
Un Stream se compone de 3 elementos:
● Un origen
● Cero o más operaciones intermedias
● Una operación final (da salida a un resultado)
Ejemplo
long totalEquipos = teams.stream()
.filter(t -> t.isHasWonWoldSeries())
.mapToInt(Team::getLastTimeWonWorldSeries)
.count();
Source
Intermediate
operations
Terminal
operation
java.util.stream
filter/map/reduce para Java
java.util.stream
List<MLBTeam> teams = ..;
// sequential version
Stream stream = students.stream();
//parallel version
Stream parallelStream = students.parallelStream();
java.util.stream
Stream Sources (Origen)
● Collections
● Generadores (Generators)
● Otros Streams
java.util.stream
Operaciones Intermedias
● .filter
● .map
● .flatMap
● .peek
● .distinct
● .sorted
● .limit
● .substream
java.util.stream
Operaciones Finales (Terminal Operations)
● reducers like reduce(), count(), findAny(), findFirst()
● collectors (collect())
● forEach
● iterators
Ejemplo
Creación de un Stream vacío
Stream<String> emptyStream = Stream.empty();
long val = emptyStream.count();
Suma de arreglo de enteros
int[] numbers = {1, 2, 3, 4, 5, 6, 7};
int sum = Arrays.stream(numbers).sum();
Convertir Stream a List
List<String> abc = Stream.of("a", "b", "c")
.collect(Collectors.toList());
Usando operación count
long count = Stream.of("one").count();
Usando operación noneMatch
boolean noElementEqualTo5 = IntStream.of(1, 2, 3)
.noneMatch(p -> p == 5);
Usando operación allMatch
List<String> teams = Lists.newArrayList("St. Louis
Cardinals Team", "NY Mets Team", "LA Angels Team",
"Washington Nationals Team", "LA Dodgers Team");
boolean containsAL = teams.stream().allMatch(p -> p.
contains("Team"));
Streams de objetos y tipos primitivos
● Java tiene valores primitivos, así como tipos de objetos.
● Para mejorar la eficiencia de Stream tenemos tres Stream de tipos primitivos
○ IntStream, DoubleStream, LongStream
● Pueden usarse junto a los métodos mapToInt(), mapToDouble(),
mapToLong()
Ejemplo
Trabajando con mapToInt
int highScore = students.stream()
.filter(s -> s.graduationYear() == 2015)
.mapToInt(s -> s.getScore())
.max();
OptionalInt oldestYear = teams.stream()
.filter(t -> t.isHasWonWoldSeries())
.mapToInt(Team::getLastTimeWonWorldSeries)
.min();
Clase Optional
Ayuda a eliminar los problemas de NullPointerException
Optional<T>
Contenedor para una referencia de objet (nulo, o objeto real).
Piensa en Optional como un stream 0 ó 1 elemento.
Garantiza que la referencia de Optional no retornará nulo.
Ejemplo
Usando Optional con Stream
Optional<String> val = Stream.of("one", "two").findAny();
Optional<String> val = Stream.of("one", "two").findFirst();
Optional<Team> opt = teams.stream().findFirst();
Otros métodos útiles en la clase Optional
opt.isPresent(); //true
Optional<Team> opt = Optional.empty();
opt.orElse(new Team("TOR", "Toronto Blue Jays", true, 1992)).isHasWonWoldSeries();
java.time
Nuevo API de fecha/tiempo en java
java.time
Tiempo Actual
Clock clockUTC = Clock.systemUTC();
Clock clockDefault = Clock.systemDefaultZone();
Zona Horaria
ZoneId zone = ZoneId.systemDefault();
ZoneId zoneAmerica = ZoneId.of("America/Santo_Domingo");
Clock clock = Clock.system(zoneAmerica);
java.time
LocalDate : Fecha más fácil de interpretar.
LocalDate date = LocalDate.now();
System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth());
Determinar si una fecha es festiva usando TemporalQuery
LocalDate date = LocalDate.of(2016, Month.JANUARY, 26);
Boolean isHoliday = date.query(new DiasFestivosRD());
Conocer la cantidad de un día que tiene un mes usando lengthOfMonth
LocalDate date = LocalDate.of(2015, Month.MARCH, 01);
int length2 = date.lengthOfMonth();
java.time
Haciendo Calculo de fechas
LocalDate sinceJava8Launch = LocalDate.of(2014, Month.MARCH, 18);
LocalDate today = LocalDate.now();
today.isAfter(sinceJava8Launch); //true
Calcular diferencia entre dos fecha usando period
LocalDate sinceBarCamp2013 = LocalDate.of(2013, Month.NOVEMBER, 16);
LocalDate currentDate = LocalDate.of(2015, Month.NOVEMBER, 28);
Period betweenDates = Period.between(sinceBarCamp2013, currentDate);
int diffInDays = betweenDates.getDays();
int diffInMonths = betweenDates.getMonths();
int diffInYears = betweenDates.getYears();
Consejos Prácticos
● Streams pueden ser infinitos, así como finitos. No existe el concepto de
"ruptura" de un Stream. Utilice la operación final (terminal) correspondiente
para detener el procesamiento O utilice el Stream de forma infinita.
● Evite forEach (excepto en casos especiales)
● Necesitas pensar en programación funcional más que programación
imperativa (trate de dejar de pensar en los bucles).
● Piense en la forma de abordar los problemas utilizando recursividad.
¿Preguntas?
¡Gracias
por
acompañarnos!
Referencias
Libros:
Functional Programming in Java (Dr. Venkat Subramaniam)
Enlaces:
http://slidedeck.io/DDuarte/java8-slides
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
https://dzone.com/articles/java-lambda-expressions-basics
http://download.java.net/jdk8/docs/
http://download.java.net/jdk8/docs/api/
http://www.infoq.com/presentations/java8-examples
http://www.infoq.com/presentations/java-8-lambda-streams
http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood
http://www.infoq.com/minibooks/emag-java-8
https://github.com/ecabrerar/java-8-mas-alla-de-las-expresiones-lambda
Código fuente de los ejemplos en GitHub
Asuntos Legales
Todas las marcas registradas, así como todos los
logotipos, imágenes, fotografías, audio y vídeos
mostrados en esta presentación son propiedad de
sus respectivos propietarios y/o representantes.
Su utilización es solamente para fines ilustrativos.
@eudriscabrera
@eudris
@ecabrerar
@eudriscabrera
Eudris Cabrera Rodríguez
Ingeniero Telemático
Desarrollador de Software / Consultor Informático
eudris@gmail.com
https://www.linkedin.com/in/eudriscabrera
http://www.slideshare.net/eudris
https://twitter.com/eudriscabrera
https://github.com/ecabrerar

Más contenido relacionado

PDF
Java 8 introducción a expresiones lambdas y api stream
PDF
Presentación Java Evolution - GlobalLogic Club
PPTX
Java 8
PDF
Tipos de Datos Abstractos (TDA)
PDF
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
PDF
PDF
Programación funcional Core Upgrade Febrero 2018 (ejemplos con Javascript)
PPT
Programar java
Java 8 introducción a expresiones lambdas y api stream
Presentación Java Evolution - GlobalLogic Club
Java 8
Tipos de Datos Abstractos (TDA)
.NET UY Meetup 6 - Integrando con C/C++ por medio de P/Invoke by Juan Ramirez
Programación funcional Core Upgrade Febrero 2018 (ejemplos con Javascript)
Programar java

La actualidad más candente (20)

PDF
Programar java
PDF
Sobrecarga de operadores
PPTX
Funciones en c++
PPTX
ODP
Seccion Fundamentos SCJP
PDF
Guía funciones
PPTX
Funciones C++ modificado
PPT
Funciones en C++
PPT
PDF
Introducción a scala
PPTX
Estructura
PDF
Sesion 01 funciones y_procedimientos
PPTX
4 Introducción al lenguaje Scala
PDF
Manejo de cadenas de caracteres java
PPTX
Instrucciones para c_
PPT
Funciones en C
PPT
5. Metodos Y Parametros
PPTX
MéTodos Java
Programar java
Sobrecarga de operadores
Funciones en c++
Seccion Fundamentos SCJP
Guía funciones
Funciones C++ modificado
Funciones en C++
Introducción a scala
Estructura
Sesion 01 funciones y_procedimientos
4 Introducción al lenguaje Scala
Manejo de cadenas de caracteres java
Instrucciones para c_
Funciones en C
5. Metodos Y Parametros
MéTodos Java
Publicidad

Similar a Java8 : Más allá de las Expresiones Lambdas (20)

PDF
Kit de supervivencia para Java 8 : como prepararse para Java 9
PPTX
Java 8 - Nuevas características
PDF
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
PDF
Introduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
PDF
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
PDF
Java fundamentos -15 consejos practicos open saturday 2018
PDF
Javascript Talento Tech Completo Para tarea final
PPTX
Curso Pythonssssssssssssssssssssssssssssssssssssssss.pptx
PDF
Semana 1 - Principios de Algoritmos.pdf
PPTX
Estructura basica de_un_programa_c_ (1)
PPTX
Estructura basica de_un_programa_c_
PPTX
Concurrencia en Java
PPTX
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
PPTX
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
PDF
Tipos de Datos Abstractos.
PDF
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PDF
Java 8: Más funcional que nunca
PPTX
Principios de Algoritmos - SEMANA 02-1.pptxxxxxx
PDF
cap6.pdf
PPTX
Portafolio de evidencias
Kit de supervivencia para Java 8 : como prepararse para Java 9
Java 8 - Nuevas características
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Introduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos practicos open saturday 2018
Javascript Talento Tech Completo Para tarea final
Curso Pythonssssssssssssssssssssssssssssssssssssssss.pptx
Semana 1 - Principios de Algoritmos.pdf
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_
Concurrencia en Java
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Tipos de Datos Abstractos.
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Java 8: Más funcional que nunca
Principios de Algoritmos - SEMANA 02-1.pptxxxxxx
cap6.pdf
Portafolio de evidencias
Publicidad

Último (6)

DOCX
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
PDF
AutoCAD Herramientas para el futuro, Juan Fandiño
PDF
Su punto de partida en la IA: Microsoft 365 Copilot Chat
PPTX
sistemas de informacion.................
PPTX
Conceptos basicos de Base de Datos y sus propiedades
PPTX
Derechos_de_Autor_y_Creative_Commons.pptx
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
AutoCAD Herramientas para el futuro, Juan Fandiño
Su punto de partida en la IA: Microsoft 365 Copilot Chat
sistemas de informacion.................
Conceptos basicos de Base de Datos y sus propiedades
Derechos_de_Autor_y_Creative_Commons.pptx

Java8 : Más allá de las Expresiones Lambdas

  • 1. #BarCampRD2015 28 Noviembre 2015, PUCMM, Santiago de los caballeros, R. D. EUDRIS CABRERA @eudriscabrera Más allá de las Expresiones Lambda
  • 2. @ecabrerar @eudriscabrera BarCampRD Java Dominicano CodeCamp SDQ 4.0 ● Ingeniero Telemático (PUCMM). ○ Desarrollador Informático / PAFI - Ministerio de Hacienda, R. D. ○ Entusiasta de la tecnología y el software libre. ○ Ganador de la beca Linux Training Scholarship 2014 categoría Developer Do-Gooder. ● Eventos Eudris Cabrera
  • 3. AGENDA ● Breve Reseña sobre Java ● Java 8 ● Expresiones Lambda ● Conceptos Básicos (sobre Programación Funcional) ● Procesando Data con Streams ● Nuevo API de fechas
  • 4. ● Java fue inventado como un lenguaje orientado a objeto. ● Utiliza una máquina virtual para su ejecución (JVM) ● La plataforma java está dividida en Java SE, Java EE, Java ME y Javafx ● ~ 2005 con Java 5 se introducen cambios significativos. ○ Genéricos ○ Loop Mejorado ○ Anotaciones ○ Enumeraciones ○ Mejora para la concurrencia (AtomicInteger) Breve Reseña sobre Java James Gosling Creador de Java en los años 90's
  • 5. Popularidad del Lenguaje Java TIOBE Index lo sitúa en el primer lugar para el mes de Noviembre del 2015. http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Githut Info* lo sitúa en el segundo lugar para el mes de Noviembre del 2015, muy cercano a Javascript, quien ocupa el primer lugar. http://githut.info *Githut Info es un espacio que muestra el uso de los lenguajes de programación dentro de la plataforma GitHub.
  • 6. Java SE 8, liberado en marzo del 2014, es la plataforma que incluye la actualización más grande para el modelo de programación Java desde el lanzamiento de la plataforma en 1996. Incluye nuevas funcionalidades e incorpora las características de los lenguaje funcionales.
  • 7. Expresiones lambdas Una expresión lambda representa una función anónima. λx → x+x Función anónima que toma un número x y devuelve el resultado x + x.
  • 8. Desarrolló en los años 30's el "Cálculo lambda", un sistema formal en lógica matemática diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Alonzo Church
  • 9. Una expresión lambda se compone de un conjunto de parámetros, un operador lambda (->) y un cuerpo de la función.
  • 10. Sintaxis () -> System.out.println("Hello Lambda") x -> x + 10 (int x, int y) -> { return x + y; } (String x, String y) -> x.length() – y.length() (String x) -> { listA.add(x); listB.remove(x); return listB.size(); }
  • 11. ¿Por qué Java necesita Expresiones Lambda?
  • 12. ● Java necesitaba cambios para simplificar la codificación paralela. ● Es muy útil para evitar tener que escribir métodos que sólo utilizamos una vez. ● Simplifica cómo pasar comportamiento como un parámetro (podemos pasar expresiones lambda a métodos como argumentos).
  • 13. Interfaces Funcionales En Java, una interfaz funcional es, básicamente, una interfaz con un único método abstracto. Este tipo de interfaces también son conocidos como tipos SAM (Single Abstract Method). @FunctionalInterface public interface Runnable { public abstract void run(); } Runnable r = () -> System.out.println("Hello Lambda");
  • 14. java.util.function ● Predicate<T> - Recibe un argumento tipo T y retorna un booleano. ● Consumer<T> - una acción que se realiza sobre un objeto ● Function<T,R> - a funcion que transforma un valor T a R ● Supplier<T> - provee una instancia de T (como un factory). ● UnaryOperator<T> - Forma especializada de Function. Recibe un valor T como argumento y retorna del un valor del mismo tipo T. ● BinaryOperator<T> - Forma especializada de BiFunction. Recibe dos argumentos y retorna un resultado, todos del mismo tipo.
  • 15. Method References Nos permiten utilizar un método como una expresión lambda. Formato: target_reference::method_name class Person { private String name; private int age; public int getAge() {return this.age;} public String getName() {return this.name;} } Person[] people = ...; Comparator<Person> byName = Comparator.comparing(Person::getName); Arrays.sort(people, byName);
  • 16. Method References (Tipos) ● Método estático (ClassName::methName) ● Un método de instancia de un objeto particular (instanceRef:: methName) ● Un método super de un objeto particular (super::methName) ● Un método de instancia de un objeto arbitrario de un tipo particular (ClassName::methName) ● Un constructor de una clase (ClassName::new) ● Un constructor de un arreglo (TypeName[]::new)
  • 17. Nuevos métodos útiles en Java 8 que pueden utilizar Lambdas Iterable Iterable.forEach(Consumer c) Collection Collection.removeIf(Predicate p) List List.replaceAll(UnaryOperator o) List.sort(Comparator c) Reemplaza "Collections.sort(List l, Comparator c)"
  • 18. Metodos Predeterminados("Default") ● Tradicionalmente, las interfaces no pueden tener definiciones de método (sólo declaraciones). ● Métodos predeterminados (Default) permite realizar implementaciones por defecto dentro de una interfaz. public interface A { default void foo() { System.out.println("Calling A.foo()"); } } public class Clazz implements A { }
  • 20. Programación Funcional Un paradigma de programación donde las funciones son entidades de primera clase. ¿Qué significa eso? Qué las funciones pueden ser usada de la misma forma que usamos enteros (integers) o cadenas de caracteres(strings). Se pueden pasar funciones como parámetros a otras funciones y pueden ser retornada como resultado de otras funciones.
  • 21. Programación Funcional El primer lenguaje ampliamente utilizado para programación funcional fue Lisp diseñado por John McCarthy en los años 50's En las universidades frecuentemente se usa Haskell para la enseñanza. Puedes empezar con JavaScript, Python, Scala o Java 8 Logo de Haskell
  • 22. ¿Por qué utilizar programación funcional? ● Ley de Moore ● Programación Concurrente ● Inmutabilidad -> El estado no cambia ● Facilidad para programar concurrentemente ● Las funciones siempre devuelven el mismo resultado para cada entrada ● Reducción de la cantidad de líneas de código. ● Código más fácil de testear.
  • 23. Programación Funcional vs Programación Imperativa ❏ Programación imperativa y programación funcional son dos enfoques muy diferentes. ❏ Imperativo. ❏ Se utilizan cambios de estado. ❏ Orden de ejecución se define como un contrato. ❏ La repetición (loop) es explícito y externo. ❏ Efectos de lado. ❏ Mutabilidad. ❏ Funcional. ❏ Se utilizan funciones aritméticas. ❏ Orden de ejecución no se define. ❏ La repetición es a través del uso de la recursión. ❏ No hay efectos de lado. ❏ Inmutabilidad.
  • 25. La programación funcional no va a resolver todos sus problemas de programación. Es sólo otra herramienta en su arsenal. Algunos problemas son más fáciles de resolver utilizando técnicas de programación funcional. Otros son más adecuados a la programación lógica. Otros se hacen mejor usando programación orientada a objetos.
  • 26. Introducción al Stream API Stream: ● Representa una abstracción para especificar cálculos agregados (acumulativos). ● Simplifica la descripción de los cálculos agregados (laziness,paralelismo).
  • 27. Elementos de un Stream Un Stream se compone de 3 elementos: ● Un origen ● Cero o más operaciones intermedias ● Una operación final (da salida a un resultado)
  • 28. Ejemplo long totalEquipos = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .count(); Source Intermediate operations Terminal operation
  • 30. java.util.stream List<MLBTeam> teams = ..; // sequential version Stream stream = students.stream(); //parallel version Stream parallelStream = students.parallelStream();
  • 31. java.util.stream Stream Sources (Origen) ● Collections ● Generadores (Generators) ● Otros Streams
  • 32. java.util.stream Operaciones Intermedias ● .filter ● .map ● .flatMap ● .peek ● .distinct ● .sorted ● .limit ● .substream
  • 33. java.util.stream Operaciones Finales (Terminal Operations) ● reducers like reduce(), count(), findAny(), findFirst() ● collectors (collect()) ● forEach ● iterators
  • 34. Ejemplo Creación de un Stream vacío Stream<String> emptyStream = Stream.empty(); long val = emptyStream.count(); Suma de arreglo de enteros int[] numbers = {1, 2, 3, 4, 5, 6, 7}; int sum = Arrays.stream(numbers).sum(); Convertir Stream a List List<String> abc = Stream.of("a", "b", "c") .collect(Collectors.toList()); Usando operación count long count = Stream.of("one").count(); Usando operación noneMatch boolean noElementEqualTo5 = IntStream.of(1, 2, 3) .noneMatch(p -> p == 5); Usando operación allMatch List<String> teams = Lists.newArrayList("St. Louis Cardinals Team", "NY Mets Team", "LA Angels Team", "Washington Nationals Team", "LA Dodgers Team"); boolean containsAL = teams.stream().allMatch(p -> p. contains("Team"));
  • 35. Streams de objetos y tipos primitivos ● Java tiene valores primitivos, así como tipos de objetos. ● Para mejorar la eficiencia de Stream tenemos tres Stream de tipos primitivos ○ IntStream, DoubleStream, LongStream ● Pueden usarse junto a los métodos mapToInt(), mapToDouble(), mapToLong()
  • 36. Ejemplo Trabajando con mapToInt int highScore = students.stream() .filter(s -> s.graduationYear() == 2015) .mapToInt(s -> s.getScore()) .max(); OptionalInt oldestYear = teams.stream() .filter(t -> t.isHasWonWoldSeries()) .mapToInt(Team::getLastTimeWonWorldSeries) .min();
  • 37. Clase Optional Ayuda a eliminar los problemas de NullPointerException Optional<T> Contenedor para una referencia de objet (nulo, o objeto real). Piensa en Optional como un stream 0 ó 1 elemento. Garantiza que la referencia de Optional no retornará nulo.
  • 38. Ejemplo Usando Optional con Stream Optional<String> val = Stream.of("one", "two").findAny(); Optional<String> val = Stream.of("one", "two").findFirst(); Optional<Team> opt = teams.stream().findFirst(); Otros métodos útiles en la clase Optional opt.isPresent(); //true Optional<Team> opt = Optional.empty(); opt.orElse(new Team("TOR", "Toronto Blue Jays", true, 1992)).isHasWonWoldSeries();
  • 39. java.time Nuevo API de fecha/tiempo en java
  • 40. java.time Tiempo Actual Clock clockUTC = Clock.systemUTC(); Clock clockDefault = Clock.systemDefaultZone(); Zona Horaria ZoneId zone = ZoneId.systemDefault(); ZoneId zoneAmerica = ZoneId.of("America/Santo_Domingo"); Clock clock = Clock.system(zoneAmerica);
  • 41. java.time LocalDate : Fecha más fácil de interpretar. LocalDate date = LocalDate.now(); System.out.printf("%s-%s-%s", date.getYear(), date.getMonthValue(), date.getDayOfMonth()); Determinar si una fecha es festiva usando TemporalQuery LocalDate date = LocalDate.of(2016, Month.JANUARY, 26); Boolean isHoliday = date.query(new DiasFestivosRD()); Conocer la cantidad de un día que tiene un mes usando lengthOfMonth LocalDate date = LocalDate.of(2015, Month.MARCH, 01); int length2 = date.lengthOfMonth();
  • 42. java.time Haciendo Calculo de fechas LocalDate sinceJava8Launch = LocalDate.of(2014, Month.MARCH, 18); LocalDate today = LocalDate.now(); today.isAfter(sinceJava8Launch); //true Calcular diferencia entre dos fecha usando period LocalDate sinceBarCamp2013 = LocalDate.of(2013, Month.NOVEMBER, 16); LocalDate currentDate = LocalDate.of(2015, Month.NOVEMBER, 28); Period betweenDates = Period.between(sinceBarCamp2013, currentDate); int diffInDays = betweenDates.getDays(); int diffInMonths = betweenDates.getMonths(); int diffInYears = betweenDates.getYears();
  • 43. Consejos Prácticos ● Streams pueden ser infinitos, así como finitos. No existe el concepto de "ruptura" de un Stream. Utilice la operación final (terminal) correspondiente para detener el procesamiento O utilice el Stream de forma infinita. ● Evite forEach (excepto en casos especiales) ● Necesitas pensar en programación funcional más que programación imperativa (trate de dejar de pensar en los bucles). ● Piense en la forma de abordar los problemas utilizando recursividad.
  • 46. Referencias Libros: Functional Programming in Java (Dr. Venkat Subramaniam) Enlaces: http://slidedeck.io/DDuarte/java8-slides http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html https://dzone.com/articles/java-lambda-expressions-basics http://download.java.net/jdk8/docs/ http://download.java.net/jdk8/docs/api/ http://www.infoq.com/presentations/java8-examples http://www.infoq.com/presentations/java-8-lambda-streams http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood http://www.infoq.com/minibooks/emag-java-8
  • 48. Asuntos Legales Todas las marcas registradas, así como todos los logotipos, imágenes, fotografías, audio y vídeos mostrados en esta presentación son propiedad de sus respectivos propietarios y/o representantes. Su utilización es solamente para fines ilustrativos.
  • 49. @eudriscabrera @eudris @ecabrerar @eudriscabrera Eudris Cabrera Rodríguez Ingeniero Telemático Desarrollador de Software / Consultor Informático eudris@gmail.com https://www.linkedin.com/in/eudriscabrera http://www.slideshare.net/eudris https://twitter.com/eudriscabrera https://github.com/ecabrerar