SlideShare a Scribd company logo
1 of 49
Download to read offline
#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

More Related Content

What's hot (20)

Programar java
Programar javaProgramar java
Programar java
 
Sobrecarga de operadores
Sobrecarga de operadoresSobrecarga de operadores
Sobrecarga de operadores
 
Funciones en c++
Funciones en c++Funciones en c++
Funciones en c++
 
Pascal
PascalPascal
Pascal
 
Seccion Fundamentos SCJP
Seccion Fundamentos SCJPSeccion Fundamentos SCJP
Seccion Fundamentos SCJP
 
Guía funciones
Guía funcionesGuía funciones
Guía funciones
 
Funciones C++ modificado
Funciones C++ modificadoFunciones C++ modificado
Funciones C++ modificado
 
Clase iv
Clase ivClase iv
Clase iv
 
Funciones en C++
Funciones en C++Funciones en C++
Funciones en C++
 
Tipos De Datos Abstractos
Tipos De Datos AbstractosTipos De Datos Abstractos
Tipos De Datos Abstractos
 
Python
Python Python
Python
 
Introducción a scala
Introducción a scalaIntroducción a scala
Introducción a scala
 
Estructura
EstructuraEstructura
Estructura
 
Sesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientosSesion 01 funciones y_procedimientos
Sesion 01 funciones y_procedimientos
 
4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala4 Introducción al lenguaje Scala
4 Introducción al lenguaje Scala
 
Manejo de cadenas de caracteres java
Manejo de cadenas de caracteres javaManejo de cadenas de caracteres java
Manejo de cadenas de caracteres java
 
Instrucciones para c_
Instrucciones para c_Instrucciones para c_
Instrucciones para c_
 
Funciones en C
Funciones en CFunciones en C
Funciones en C
 
5. Metodos Y Parametros
5.  Metodos Y Parametros5.  Metodos Y Parametros
5. Metodos Y Parametros
 
MéTodos Java
MéTodos JavaMéTodos Java
MéTodos Java
 

Similar to Java8 : Más allá de las Expresiones Lambdas

Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9Eudris Cabrera
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas característicasFernando Petrola
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Eudris Cabrera
 
Introduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
Introduction to Lambda Calculus using Smalltalk by Facundo Javier GelattiIntroduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
Introduction to Lambda Calculus using Smalltalk by Facundo Javier GelattiFAST
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Eudris Cabrera
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Eudris Cabrera
 
Semana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfSemana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfCarlosJahnsen3
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Maztherprozh
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Maztherprozh
 
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptxSesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptxpame888173
 
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxConceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxgalletasdecoco84
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
ESTRUCTURA BASICA PARA C++
ESTRUCTURA BASICA PARA C++ESTRUCTURA BASICA PARA C++
ESTRUCTURA BASICA PARA C++JazminIbarra1106
 
Unidad 2 programación estructurada
Unidad 2 programación estructuradaUnidad 2 programación estructurada
Unidad 2 programación estructuradaRoberth Camana
 

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

Kit de supervivencia para Java 8 : como prepararse para Java 9
Kit de supervivencia para Java 8 :  como prepararse para Java 9Kit de supervivencia para Java 8 :  como prepararse para Java 9
Kit de supervivencia para Java 8 : como prepararse para Java 9
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
 
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
Java 8: Expresiones Lambdas y API Stream BarCamp RD 2016
 
Introduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
Introduction to Lambda Calculus using Smalltalk by Facundo Javier GelattiIntroduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
Introduction to Lambda Calculus using Smalltalk by Facundo Javier Gelatti
 
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
Java fundamentos -15 consejos prácticos - Encuentro Universitario Comunidad J...
 
Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018Java fundamentos -15 consejos practicos open saturday 2018
Java fundamentos -15 consejos practicos open saturday 2018
 
Semana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdfSemana 1 - Principios de Algoritmos.pdf
Semana 1 - Principios de Algoritmos.pdf
 
Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_Estructura basica de_un_programa_c_
Estructura basica de_un_programa_c_
 
Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)Estructura basica de_un_programa_c_ (1)
Estructura basica de_un_programa_c_ (1)
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptxSesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
Sesión 1_ FUNDAMENTOS DE PROGRAMACIÓN EN JAVASCRIPT.pptx
 
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxConceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
 
Tipos de Datos Abstractos.
Tipos de Datos Abstractos.Tipos de Datos Abstractos.
Tipos de Datos Abstractos.
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Java 8: Más funcional que nunca
Java 8: Más funcional que nuncaJava 8: Más funcional que nunca
Java 8: Más funcional que nunca
 
cap6.pdf
cap6.pdfcap6.pdf
cap6.pdf
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
ESTRUCTURA BASICA PARA C++
ESTRUCTURA BASICA PARA C++ESTRUCTURA BASICA PARA C++
ESTRUCTURA BASICA PARA C++
 
Unidad 2 programación estructurada
Unidad 2 programación estructuradaUnidad 2 programación estructurada
Unidad 2 programación estructurada
 
Manejo de memoria
Manejo de memoriaManejo de memoria
Manejo de memoria
 

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