Este documento presenta las principales características de Java 8 como el manejo de fecha y hora con la clase Clock y las clases DateTime, la programación funcional mediante expresiones lambda, el uso de Optional para evitar nulos, los streams de colecciones para iterar de forma declarativa sobre conjuntos de datos, y CompletionStage para trabajar de forma asíncrona y no bloqueante.
Esta presentación nos muestra qué es la programación reactiva, en qué consiste, qué nos permite hacer y por qué está tan de moda. Además, podemos ver el uso concreto de esta programación utilizando RxJava.
Autor: Juan Pablo González de Gracia.
Ponencia ofrecida por Oier Blasco en DroidconMAD2013. Sinopsis: La programación reactiva es un paradigma de programación que se centra en los flujos de datos. La presentación trata de cómo podemos usar la programación reactiva para simplificar la programación de tareas asíncronas en android (principalmente las aplicaciones que consumen datos de servicios remotos). Para ello comenzaremos la presentación con una introducción sobre los motivos y los fundamentos de la programación reactiva y como los implementa RxJava (El port open-source hecho por Netflix de la Rx extensions de microsoft). El la segunda para parte de la presentación veremos algunos ejemplos concreto de cómo podemos aplicar estos principios a problemas cotidianos en android.
Presentación sobre Reactive Programming en la JVM para el meetup JVM_MX.
Se mostraron conceptos sobre Reactive Programming y Functional Reactive Programming con la biblioteca RxJava de Netflix.
En esta presentación cubrimos el modelo de memoria del JDK 5/6/7, a partir de JDK 8 hay un cambio en el modelo de memoria, así que no toda la presentación seria valida, aunque algunos conceptos se mantienen.
Los ejemplos se pueden encontrar en https://github.com/ldebello/javacuriosities/tree/master/MemoryManagement
Esta presentación nos muestra qué es la programación reactiva, en qué consiste, qué nos permite hacer y por qué está tan de moda. Además, podemos ver el uso concreto de esta programación utilizando RxJava.
Autor: Juan Pablo González de Gracia.
Ponencia ofrecida por Oier Blasco en DroidconMAD2013. Sinopsis: La programación reactiva es un paradigma de programación que se centra en los flujos de datos. La presentación trata de cómo podemos usar la programación reactiva para simplificar la programación de tareas asíncronas en android (principalmente las aplicaciones que consumen datos de servicios remotos). Para ello comenzaremos la presentación con una introducción sobre los motivos y los fundamentos de la programación reactiva y como los implementa RxJava (El port open-source hecho por Netflix de la Rx extensions de microsoft). El la segunda para parte de la presentación veremos algunos ejemplos concreto de cómo podemos aplicar estos principios a problemas cotidianos en android.
Presentación sobre Reactive Programming en la JVM para el meetup JVM_MX.
Se mostraron conceptos sobre Reactive Programming y Functional Reactive Programming con la biblioteca RxJava de Netflix.
En esta presentación cubrimos el modelo de memoria del JDK 5/6/7, a partir de JDK 8 hay un cambio en el modelo de memoria, así que no toda la presentación seria valida, aunque algunos conceptos se mantienen.
Los ejemplos se pueden encontrar en https://github.com/ldebello/javacuriosities/tree/master/MemoryManagement
Continuando con la introducción al mundo de los Thread en Java
Se pueden encontrar algunos ejemplos en https://github.com/ldebello/javacuriosities/tree/master/Threads
Continuando con la introducción al mundo de los Thread en Java
Se pueden encontrar algunos ejemplos en https://github.com/ldebello/javacuriosities/tree/master/Threads
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesMartín Volpe
Uno de los principales problemas al momento de crear aplicaciones de escritorio es el manejo del flujo de ejecución. Este problema se complica considerablemente al tener que ejecutar funciones bloqueantes. Twisted, a pesar de estar diseñado para networking, tiene una serie de herramientas para el maenjo ascincrónico del flujo facilmente adaptables a los Toolkits gráficos mas populares.
Java8 : Más allá de las Expresiones LambdasEudris Cabrera
Mi presentación en el #BarCampRD2015. En esta charla abordamos las bondades de #Java8 haciendo hincapié en las
expresiones lambdas y las características de la programación funcional.
Programación Funcional y Orientada a Objetos con AsincronismosVíctor Bolinches
Jornadas de capatación de pequeños talentos Capgemini - UPV
18/05/2017
Ponencia Universidad Politécnica de Valencia - https://www.upv.es/
ETSINF - Escuela Técnica Superior de Ingeniería Informática
Curso de test driven development usando AngularJS, Jasmine, Karma, Protractor, y Gulp para automatizar todo.
Codigo del proyecto de ejemplo:
https://github.com/rodrigopivi/angularComponentStarter
La arquitectura de microservicios persigue maximizar la adaptabilidad de las soluciones mediante la distribución de las responsabilidades del software en servicios con ciclo de vida independiente.
Lograr la independencia de los microservicios es clave para beneficiarse de las ventajas de la arquitectura. Esto exige un profundo entendimiento del dominio funcional, lo que se logra mediante DDD.
Por otro lado la arquitectura hexagonal nos permite estructurar el software de manera que la capa de código relacionada con el dominio funcional no se vea interferida por aspectos tecnológicos, es decir, que dicha capa sólo exprese el Ubiquitous Language, es decir el lenguaje del modelo en según lo llama DDD.
Dicha separación en capas y el invertir las dependencias permite además garantizar la máxima portabilidad del código.
¿Qué vamos a ver?
1. Beneficios
2. Domain Driven Design.
- Conceptos - Big Picture.
- Conceptos - Code architecture.
- Event Storming.
3. Clean Code Architecture.
- Hexagonal Architecture.
- Onion Architecture.
Bots 3.0: Dejando atrás los bots conversacionales con Dialogflow.Paradigma Digital
Atención personalizada y automatización de operativas con IA de forma sencilla con DialogFlow. Al terminar esta charla serás capaz de crear un bot con Dialogflow que solucione tareas sencillas.
En esta charla veremos:
- Cuales son las necesidades de negocio que satisface este tipo de soluciones
- Alternativas en el mercado
- Solución de la necesidad con DialogFlow
Ponente: Alex Asensio - Business Lead en Paradigma Digital
Pragmático y siempre enfocado a objetivos de negocio. Enamorado de la tecnología pero también con la forma en que entregamos software a nuestros clientes, basada en el "empirismo". Tech + Biz mano a mano es la fórmula de éxito que queremos compartir con ellos.
En esta nueva entrega sobre service-mesh veremos el que probablemente se convertirá en el producto de referencia: Istio.
Analizaremos las funcionalidades que aporta, su arquitectura interna, la integración con productos de terceros así como su repercusión
dentro de las arquitecturas actuales. Realizaremos algunos ejemplos para mostrar la funcionalidad y configuración
Ponente:
Abraham Rodríguez está especializado en soluciones cloud native con arquitecturas de microservicios, stack con el que ha trabajado en diversos proyectos. Apasionado defensor de todo lo relacionado con cloud, metodologías ágiles, software libre y devops.
En esta presentación hablamos de Linkerd, uno de los pioneros en el ámbito de las "arquitecturas Service Mesh". Haremos un repaso por la historia de este producto, conoceremos sus principales funcionalidades y tendremos una parte práctica en la que mostraremos su integración en arquitecturas distribuidas junto a Docker y Kubernetes.
¿Cómo hago que mis APIs sean usables?
A través de un ejemplo desarrollado en Spring veremos como realizar todo el proceso de diseño aplicando un conjunto de buenas prácticas que te ayuden en el proceso de toma de decisión a la hora de enfrentarte al diseño de APIs.
En este meetup vamos a analizar uno de los pilares básicos en el proceso de transformación digital de las empresas: API Management. Para ello, explicaremos en qué consiste esta estrategia, y los diferentes conceptos y componentes que intervienen en la misma.Además, para completar esta visión con un caso práctico, mostraremos un ejemplo de implementación mediante uno de los productos OpenSource de API Management más exitoso del mercado: WSO2.
https://www.meetup.com/Microservicios
¿Cómo se despliega y autoescala Couchbase en Cloud? ¡Aprende de manera práctica!Paradigma Digital
En el pasado Meetup, presentamos Couchbase de manera general, pero ha llegado el momento de ir ahondando en los detalles del producto para conocer todas sus capacidades. Esto nos permitirá estar en mejor disposición para adoptarlo en nuestros proyectos.
En esta ocasión, se hablará de la capa de operaciones y despliegue de Couchbase aunque no con un enfoque tradicional en máquinas físicas, sino siguiendo las buenas prácticas del mercado. Explicaremos y haremos el despliegue en Google Cloud con escalabilidad horizontal elástica y automática.
Para llevar a cabo esto haremos uso, entre otras, de las siguientes tecnologías: Google Cloud, Kubernetes, Python y, por supuesto, Couchbase.
Pondremos a prueba nuestra infraestructura con una pequeña aplicación, si queréis ver los resultados, no os lo podéis perder!
Google Analytics es una herramienta de analítica la que se conoce sólo una parte de su potencial. Además de medir audiencias y su comportamiento, Google Analytics permite priorizar las inversiones en marketing online, recoger comportamientos de Single Page Applications y visualizar datos offline, por ejemplo de CRM y combinarlos con los de visitas online. También es posible recoger datos en tiempo real de ventas, por ejemplo de ecommerce y de dispositivos físicos como bluetooth beacons. Las funcionalidades de Google Analytics, en combinación con Big Query y otros servicios de Google Cloud Platform, la convierte en una de las plataformas más interesantes de analítica para la transformación digital.
Si quieres ver el vídeo en el que fue usada esta presentación, pulsa aquí: https://www.youtube.com/watch?v=2mfIU-NXGXI
Para ver la convocatoria en nuestra web, clic aquí: https://www.paradigmadigital.com/eventos/usar-google-analytics/
La convocatoria a través del grupo de Meetup.com, clic aquí: https://www.meetup.com/es-ES/Front-end-Developers-Madrid/events/231793469/
¿Cómo definir el roadmap de transformación digital? En Paradigma llevamos más de 20 años ayudando a grandes compañías en su camino hacia la digitalización.
En Paradigma creemos que los grandes dragones digitales han desbancado a las empresas tradicionales. La clave para combatir esos dragones es la transformación digital.
El pasado 17 de mayo se celebró en las oficinas de Paradigma Digital el meetup mensual del grupo Python Madrid. Pablo González Fuente, de GMV, nos habló de Python y Flink.
Vídeo del evento: https://www.youtube.com/watch?v=HPfNDL-jIGM
El pasado 17 de mayo se celebró en las oficinas de Paradigma Digital el meetup mensual del grupo Python Madrid. Nuestro compañero Álvaro León nos habló de Kafka y Python.
Vídeo de la presentación: https://www.youtube.com/watch?v=HPfNDL-jIGM
Somos una empresa nativa digital, creada para Internet y con una manera diferente de hacer las cosas. A lo largo de estos últimos 10 años hemos construido una compañía sin jerarquías con una cultura de empresa basada en la libertad y la responsabilidad, que nos ha permitido llegar a ser el partner tecnológico de algunas de las grandes empresas españolas. Te contamos cuál es nuestro secreto. ¿Quieres conocer la cultura digital de Paradigma?
Kubernetes es un proyecto open source de Google cuyo propósito es el de hacer de orquestador de containers. En este seminario se tratará de crear una base partiendo desde los principios más fundamentales, de forma que cualquiera con unos conceptos básicos de contenedores pueda entender cómo funciona kubernetes y qué utilidades nos ofrece a la hora de manejar contenedores.
Ponente: Alfredo Espejel, técnico de sistemas en Paradigma
Alfredo cuenta con casi 10 años de experiencia en administración de sistemas, principalmente Linux. Interesado también en las redes, pero sobre todo en las últimas tendencias y tecnologías.
Vídeo de la charla: https://www.youtube.com/watch?v=zI16fatmnVQ
Más información sobre el meetup: http://www.meetup.com/Cloud-Computing-Spain/events/226254765/
5. Clock
La clase Clock aparece para reducir el uso de métodos estáticos
y facilitar el desarrollo de pruebas en casos donde es necesario
trabajar con la fecha y hora actuales
• Dependencia inyectable
• Métodos factoría
• Abstracta
• Múltiples implementaciones
• SystemClock, TickClock, FixedClock, OffsetClock
Java 8 :: Time
6. DateTime
• Basado en la biblioteca Joda-Time
• Surge por la necesidad de tener una conciencia global de la hora
• Un tipo de precisión diferente según la necesidad
• ZonedDateTime, OffsetDateTime, LocalDateTime, y más
• Inmutable
• Compatible con Clock
ZonedDateTime date = ZonedDateTime.now(clock)
• Operaciones con TemporalAmount
• Parser personalizable mediante DateTimeFormatter
Java 8 :: Time
7. Units - TemporalAmount
Duration
• Permite manejar distintas
magnitudes de tiempo de
tipo exacto (horas, minutos,
segundos, etc)
• Basada en segundos y
nanosegundos
Period
• Pensado para manejar
unidades de tiempo más
abstractas (años, meses,
semanas, etc)
• Para operar con fechas
• Basada en años, meses y
días
Pero hay más…
Java 8 :: Time
8. Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
10. Definición y características
• Es un paradigma de la programación declarativa basado en el uso de funciones
matemáticas.
• Tiene sus raíces en el cálculo lambda.
• No hay efectos colaterales: el valor generado por una función depende exclusivamente
de los argumentos pasados a la función.
• No hay mutabilidad en variables.
• Funciones de primera clase: las funciones se tratan como objetos con el
comportamiento que ello conlleva, eg. ser almacenadas en una variable.
Function<Integer, Integer> addTwo = value -> value + 2
• Funciones de orden superior: son funciones que pueden tomar otras funciones como
argumentos o devolverlos como resultados.
int myMethod(Function<Integer,Integer> f)
Java 8 :: Functional Programming
11. Interfaz funcional y expresión lambda
• Una interfaz funcional es aquella interfaz que sólo define un método abstracto.
• Se define con la anotación @FunctionalInterface
• Se puede expresar mediante una expresión lambda.
• Ejemplo:
λ expression
Java 8 :: Functional Programming
12. Programación
Imperativa
Programación
Funcional
Define un algoritmo en el que se
describen los pasos necesarios
para solucionar un problema.
Se describe el problema que se
quiere solucionar mediante
funciones sin efectos
colaterales.
Java 8 :: Functional Programming
13. Ejemplos
java.util.function
Interfaz Funcional Propósito Expresión Lambda
Consumer<T> Operación que acepta un argumento y no devuelve ningún resultado x -> { }
Function<T, R> Operación que acepta un argumento y produce un resultado x -> y
Predicate<T> Operación que acepta un argumento y devuelve true/false x -> true
Supplier<T> Operación que no acepta argumentos y proporciona un resultado () -> x
BiFunction<T, U, R> Operación que devuelve un resultado a partir de dos argumentos (x, y) -> z
BiPredicate<T, U> Operación que acepta dos argumentos y devuelve true/false (x, y) -> false
... ... ...
Java 8 :: Functional Programming
14. Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
17. Qué son y por qué usarlos opcionales
• Te salvan de situaciones con null
• Optional.Empty es más versátil que null
• Interfaz fluida
• Utiliza el nuevo paradigma funcional
• Facilita evitar la divergencia de flujos en distintas ramas
• Falla rápido (null ó empty)
Java 8 :: Optional
18. Cuándo
SÍ
• Cuando tengas la tentación de devolver un null
• Cuando quieras operar con un campo que pueda no existir
NO
• Como parámetros
• Dentro de estructuras de datos (Colecciones)
• Como dato a serializar
• Como atributo de clase
Java 8 :: Optional
19. Método Estático Función Estado Descripción
of Sí - Creación Crea un nuevo opcional lanza excepción si está vacío
ofNullable Sí - Creación Crea un nuevo opcional
empty Sí - Creación Crea un opcional que siempre será vacío
filter No Predicate Intermedio Elimina el contenido que no cumpla el predicado
map No Function Intermedio Transforma el contenido
flatMap No Function Intermedio Ataja una indirección de optionales
isPresent No - Final Nos dice si existe un contenido
ifPresent No Consumer Final Ejecuta un bloque usando el contenido
get No - Final Devuelve el contenido o en su defecto lanza una excepción
orElse No - Final Devuelve el contenido o en su defecto el valor dado
orElseGet No Supplier Final Devuelve el contenido del opcional o en su defecto del bloque dado
orElseThrow No Supplier Final Devuelve el contenido o lanza la excepción especificada
java.util.Optional<T>
Java 8 :: Optional
20. Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
22. Definición y características I
• Clase principal: Stream<T> perteneciente a java.util.stream. Se compone de tres elementos:
1. Fuente de datos.
2. Operaciones intermedias.
3. Operación final.
• Tipos de operaciones:
• Intermedias: filter(), map(), distinct(), skip(), limit(), ...
• Finales: collect(), reduce(), findAny(), noneMatch(), count(), …
• Las operaciones intermedias son perezosas: sólo se invocarán si se ejecuta una
operación final y siempre en el orden definido. El pipeline de operaciones se ejecutará
completo para cada elemento.
Java 8 :: Collection Streams
23. Definición y características II
• Iteración interna vs iteración externa del paradigma imperativo.
• Ejecutar una operación final hace al stream inaccesible y no podrá ser reutilizado:
Java 8 :: Collection Streams
29. CompletionStage
• Trabajo asíncrono (No bloqueante)
• CompletableFuture es la implementación de referencia
• Permite trabajar de una forma sencilla con futuros
• Es soportado en frameworks asíncronos
• Play Framework versión 2
• Spring Boot versión 2
• Probablemente más...
Java 8 :: Concurrency
30. Método Estático Función Productor Descripción
runAsync Sí Runnable No Crea un nuevo completable y comienza a ejecutar el trabajo
supplyAsync Sí Supplier Si Crea un nuevo completable y comienza el trabajo
thenApply No Function Si Transforma el resultado de un completable mediante otro
thenAccept No Consumer No Realiza una tarea a partir del resultado de dos completables
thenCompose No Function Si Asimila un completable producido a partir de otro
thenCombine No BiFunction Si Transforma el contenido de dos completables en uno nuevo
exceptionally No Function Si Ejecuta una tarea cuando el completable termine de forma excepcional
Metodos más utilizados
java.util.concurrent.CompletionStage<T>
Java 8 :: Concurrency
31. Método Estático Función Productor Descripción
runAfterBoth No Runnable No Realiza una tarea cuando ambos completables terminan
thenAcceptBoth No BiConsumer No Realiza una tarea a partir del resultado de dos completables
runAfterEither No Runnable No Realiza una tarea cuando alguno de los dos completables termina
applyToEither No Function Si Transforma el resultado del primer completable en terminar
acceptEither No Consumer No Realiza una tarea a partir del primer completable que termine
whenComplete No BiConsumer No Realiza una tarea cuando el completable termine aunque lo haga de forma
excepcional, no altera el resultado
handle No BiFunction Si Ejecuta una tarea cuando el completable termine aunque lo haga de forma
excepcional
Otros metodos
java.util.concurrent.CompletionStage<T>
Java 8 :: Concurrency
32. Y más… CompletableFuture
anyOf
• Acepta un array de completables
• Realiza una tarea cuando alguna
de las anteriores se ha
completado
allOf
• Acepta un array de completables
• Realiza una tarea cuando todas
las anteriores se han
completado
Todos los métodos anteriores permiten realizar una correcta
sincronización, sin tener que forzar en ningún momento bloqueo
del hilo de ejecución, mediante el encadenando de tareas
asíncronas. Pero pueden ser algo engorrosas cuando
dependemos del resultado de muchas tareas.
Java 8 :: Concurrency
33. Callbacks
La clase CompletableFuture permite ser utilizada como callback
mediante la instanciación como incompleto.
CompletableFuture<T> promise = new CompletableFuture<>();
Que en un futuro será completado.
promise.complete(result);
Java 8 :: Concurrency
34. Executors
Los métodos definidos por CompletionStage tienen una versión
alternativa mediante sobrecarga que permite establecer un pool
de hilos para ejecutar las tareas.
Normalmente a estos métodos se les distingue porque el nombre
termina por Async y aceptan un Executor.
<U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) -> conserva el pool
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn) -> ForkJoin
<U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor)
Java 8 :: Concurrency
35. Bajemos a ver un poco
de código...
GitHub repository:
https://github.com/ignaciomolina/Java8TheRoadSoFar
36. The road so far…
● Time
● Functional Programming
● Optionals
● Collection Streams
● Concurrency