Академический Документы
Профессиональный Документы
Культура Документы
Aprendizaje de la programación
reactiva con Java 8
nickolay Tsvetinov
BIRMINGHAM - Bombay
Aprendizaje de la programación reactiva con Java 8
Todos los derechos reservados. Ninguna parte de esta publicación puede ser reproducida, almacenada en un sistema
de recuperación o transmitida en cualquier forma o por cualquier medio, sin la previa autorización por escrito del editor,
excepto en el caso de citas breves incorporados en artículos de revistas.
Cada esfuerzo se ha hecho en la preparación de este libro para asegurar la exactitud de la información
presentada. Sin embargo, la información contenida en este libro se vende sin garantía, ya sea expresa o
implícita. Ni el autor, ni Packt Publishing, y sus concesionarios y distribuidores serán responsables por cualquier
daño causado o presuntamente causado directa o indirectamente por este libro. Packt Publishing se ha esforzado
para proporcionar información sobre marcas registradas acerca de todas las compañías y productos
mencionados en este libro por el uso apropiado de capitales. Sin embargo, Packt Publishing no puede garantizar
la exactitud de esta información.
www.packtpub.com
créditos
Coordinador de produccion
Editor de puesta en marcha
Conidon Miranda
Veena Pagare
trabajo portada
Editor de adquisición
Conidon Miranda
Larrisa Pinto
Adrian Raposo
Editor técnico
Abhishek R. Kotian
Brandt D'Mello
Neha Vyas
Sobre el Autor
nickolay Tsvetinov es un versátil desarrollador web profesional en la primera plataforma abierta integral
de TransportAPI-Gran Bretaña por las soluciones de transporte. Durante su carrera como desarrollador de
software, que experimentó tanto buenas como malas y jugó con la mayoría de los lenguajes de programación
populares desde-C y Java a Ruby y JavaScript. Durante los últimos 3-4 años, ha sido la creación y
mantenimiento de aplicaciones de una sola página (SPA) y las arquitecturas de la API de backend que les
sirven. Él es un fan de software de código abierto, rieles, Vim, Sinatra, Ember.js, Nodo. js, y Nintendo. Era un
músico y poeta sin éxito, pero él es un esposo y padre éxito. Su área de interés y experiencia incluye la
programación declarativa / funcional y reactivo que dio lugar a la creación de ProAct.js ( http://proactjs.com), que
es una biblioteca que aumenta el lenguaje JavaScript y lo convierte en un lenguaje reactivo.
En primer lugar, quiero dar las gracias a mi esposa, Tania. Escribí este libro porque ella me
dijo que yo era capaz de hacer esto. Ella estaba conmigo todos estos meses; Trabajé a altas
horas de la noche y los fines de semana, pero ella no le importaba. Ella también me ayudó
con el contenido de este libro. Gracias, Tania; Te amo y Dedico este libro a usted. Quiero dar
las gracias a mi niña, Dalia. Ella es la única que me hace aprender y hacer cosas nuevas. Un
día, yo quiero que ella esté orgulloso de mí, ella es mi sol. Quiero agradecer a mis colegas de
TransportAPI, especialmente Dave, que me ayudó con mi Inglés, y Jonathan y Martin, que me
dio el valor para terminar el libro.
Quiero Soluciones de agradecimiento Astea, ya que me dio espacio para escribir, así como mis
padres, Georgi y Dimana, que hicieron lo mismo para mí los fines de semana. Por último, quiero
agradecer a todos mis amigos que me apoyaron-Simeon, Rosen, Deyan, Pavel, mi hermana,
Samuel Gruetter tiene un título de Licenciado en Informática por la Escuela Politécnica Federal de Lausana
(EPFL), Suiza. Como asistente del estudiante y miembro del equipo de la EPFL Scala, desarrolló RxScala, que es un
adaptador de Scala para la biblioteca RxJava reactiva extensiones. De esta manera, contribuyó a RxJava. También
fue un asistente de enseñanza para el Principios de programación reactiva masiva curso en línea abierta en Coursera,
que es el primer curso en línea sobre la programación reactiva.
Él ha estado trabajando con Java y tecnologías básicas relacionadas desde el año 2005 para llevar los beneficios de
Java a la fabricación y empresas de logística.
Él fue el primero en marco Rx.NET puerto de Microsoft para volver Java en 2010; sin embargo, el concepto era tan
adelantado a su tiempo que su biblioteca no captó mucha atención hasta Netflix salió con el puerto RxJava
independiente en 2013. Se unió al proyecto no mucho más tarde y es un colaborador núcleo y ha contribuido a un 30
por ciento del código de la biblioteca en los últimos años. Con varios años de experiencia en programación reactiva y
como un desarrollador principal de RxJava, con frecuencia responde a preguntas sobre la biblioteca de desbordamiento
de pila, en la que revisa las solicitudes de extracción en la página del proyecto RxJava GitHub y mensajes correcciones
de errores y mejoras sobre una base regular.
Timo Tuominen desarrolla proyectos de software a gran escala desde la concepción hasta la finalización de los clientes, incluyendo
grandes empresas de telecomunicaciones y fabricantes de dispositivos. A medida que la dirección técnica, que ha creado docenas de
productos y servicios tanto para el uso de consumidores y empresas.
Trabajar con Futurice, que comenzó a usar RxJava en 2013 y diseñó uno de los primeros arquitecturas RxJava puros
en Android. Su enfoque novedoso fue el resultado de los principios de programación reactiva funcionales inflexibles
que se aplican a una plataforma existente. Varias aplicaciones y miles de confirmaciones de código más adelante,
ahora está convencido de que RxJava y FRP representan una nueva y mejor manera de compilación del software.
Me gustaría dedicar este libro a todos los que han puesto al día con mis innovaciones
RxJava.
Zhu Shixiong es un confirmador RxJava y también mantiene el proyecto RxScala. Recibió su grado de maestría de la
ciencia en informática de la Universidad de Pekín, China. Después de eso, se unió a MicroStrategy y trabajó en varios
proyectos de grandes volúmenes de datos. También ha trabajado en el equipo de infraestructura en Xiaomi.
Actualmente, él está viviendo en Beijing y trabajar en el proyecto de chispa Apache, que es una plataforma rápida y
general para el procesamiento de datos a gran escala.
www.PacktPub.com
y más
Para los archivos de soporte y descargas relacionadas con su libro, por favor visite www.PacktPub.com.
¿Sabías que Packt ofertas ebook versiones de cada libro publicado, con archivos PDF y ePub disponibles? Se puede actualizar a la versión
de libro electrónico en www.PacktPub.com y como un cliente de impresión de libros, usted tiene derecho a un descuento en la copia de libros
electrónicos. Póngase en contacto con nosotros en
service@packtpub.com para más detalles. A www.PacktPub.com, también se puede leer una colección de artículos técnicos
gratuitos, crea para una serie de boletines gratuitos y recibe descuentos y ofertas exclusivas en los libros y libros electrónicos
Packt.
TM
https://www2.packtpub.com/books/subscription/packtlib
¿Necesita soluciones inmediatas a las preguntas que su TI? PacktLib es la biblioteca de libros digitales en línea Packt. Aquí, usted
puede buscar, acceder y leer toda la biblioteca de los libros de Packt.
[ yo ]
Tabla de contenido
La acumulación de datos 71
Resumen 74
Capítulo 5: Los combinadores, condicionales, y tratamiento de errores 75
La combinación de los casos observables 76
El operador postal 76
El operador combineLatest 78
El operador de combinación 80
El operador concat 81
Los operadores condicionales 83
El operador amb 83
El takeUntil (), takeWhile (), skipUntil (), y skipWhile () operadores
condicionales 84
El DefaultIfEmpty () operador 86
Gestión de errores 86
Los operadores de retorno y CV 87
La técnica de volver a intentar 88
Un ejemplo de cliente HTTP 91
Resumen 95
Capítulo 6: Uso de concurrencia y paralelismo con Schedulers 97
programadores de RxJava 98
Depuración observables y sus programadores 98
El intervalo observable y su parrilla de programación por defecto 101
Tipos de programadores 102
El planificador Schedulers.immediate 105
El planificador Schedulers.trampoline 106
El planificador Schedulers.newThread 107
El planificador Schedulers.computation 108
El planificador Schedulers.io 110
El método Schedulers.from (ejecutor) 111
[Ii]
Tabla de contenido
profundidad 135
Prueba de observables casos asíncronos con la ayuda de la clase
TestScheduler 136
Resumen 139
Capítulo 8: Gestión de Recursos y RxJava Extendiendo 141
Administracion de recursos 142
Introduciendo el método Observable.using 142
El almacenamiento en caché de datos con Observable.cache 146
La creación de los operadores personalizados con ascensor 148
Componiendo varios operadores con el operador Observable.compose
151
Resumen 153
Índice 155
[Iii]
Prefacio
la programación reactiva ha existido durante décadas. Ha habido un par de implementaciones de la programación
reactiva desde el momento en Smalltalk era un lenguaje joven. Sin embargo, sólo recientemente se ha popularizado y
ahora se está convirtiendo en una tendencia. ¿Por qué ahora lo preguntas? Debido a que es bueno para escribir
rápido, aplicaciones en tiempo real y las tecnologías actuales y la Web lo exigen.
Me involucré en ella de nuevo en 2008, cuando el equipo era parte de un creador fue el desarrollo de libro multimedia
llamada Sophie 2. Tenía que ser rápido y sensible por lo que creamos un marco llamado Prolib, que proporcionó los
objetos con propiedades que podría depender de entre sí (en otras palabras, hemos implementado enlaces para swing y
mucho más, transformaciones, filtrado, y así sucesivamente). Se sentía natural para cablear los datos del modelo a la
interfaz gráfica de usuario de esta manera.
Por supuesto, esto estaba muy lejos del enfoque funcional al igual que viene con RX. En 2010, Microsoft lanzó
RX y, después de eso, Netflix portado a Java-RxJava. Sin embargo, Netflix lanzó RxJava a la comunidad de
código abierto y el proyecto se convirtió en un gran éxito. Muchos otros idiomas tienen su puerto de RX y
muchas alternativas a la misma. Ahora, se puede codificar utilizando la programación reactiva en su base de
Java y el alambre a frontend de su RxJava.
Este libro trata de explicar a usted lo que la programación reactiva se trata y cómo utilizarlo con RxJava. Tiene
muchos pequeños ejemplos y explica los conceptos y detalles de la API en pequeños pasos. Después de leer
este libro, usted tendrá una idea de RxJava, la programación funcional, y el paradigma reactivo.
[V]
Prefacio
Capitulo 2, El uso de las construcciones funcionales de Java 8, le enseñará cómo utilizar las nuevas
construcciones lambda de Java 8. Se explicará algunos conceptos de programación funcional y le mostrará cómo
usarlos con RxJava en sus programas de reactivos.
Capítulo 3, Creación y conexión de los observables, Observadores, y los sujetos, le mostrará los elementos
básicos de la biblioteca llamada RxJava los observables. Usted aprenderá la diferencia entre 'caliente' y
observables 'frío' y cómo suscribirse y darse de baja de ellos usando una instancia de suscripción.
Capítulo 4, La transformación, filtrado y acumulación de los datos, le guiará a través de los operadores de
reactivos básicos, que va a aprender a utilizar para lograr cálculos paso a paso. Este capítulo le dará una
idea de cómo transformar los eventos los observables emiten, cómo filtrar sólo los datos que necesitamos, y
cómo agrupar, se acumulan, y procesarla.
Capítulo 6, El uso de concurrencia y paralelismo con programadores, le guiará a través del proceso de la
escritura de programas simultáneos y paralelos con RxJava. Esto se logrará mediante los programadores
RxJava. Los tipos de programadores se introducirán y se llega a saber cuándo y por qué utilizar cada uno de
ellos. En este capítulo se le presentará con un mecanismo que le mostrará cómo evitar y aplicar
contrapresión.
Capítulo 7, Prueba de su Aplicación RxJava, le mostrará cómo poner a prueba la unidad de sus aplicaciones RxJava.
Capítulo 8, La extensión de Gestión de Recursos y RxJava, le enseñará la forma de gestionar los recursos utilizados como
fuentes de datos de las aplicaciones RxJava. Vamos a escribir nuestros propios operadores observables aquí.
[Vi]
Prefacio
• Gradle para construir el proyecto-2.x, que se puede descargar desde https: // gradle.org/downloads
• Eclipse para abrir el proyecto. También necesitará el plugin para Eclipse Gradle, que puede ser
descargado desde el Eclipse Marketplace. Por supuesto, puede utilizar Gradle desde la línea de
comandos y pasar por el código con Vim o cualquier otro editor de texto arbitrario
conocimientos actuales de la programación reactiva, este libro es para ti. Este libro puede ser útil a cualquier persona, sin
importar si son principiantes, los programadores avanzados, o incluso los expertos. Usted no necesita tener ninguna
convenciones
En este libro, encontrará una serie de estilos de texto que distinguen entre diferentes tipos de información.
Estos son algunos ejemplos de estos estilos y una explicación de su significado.
Las palabras de código en el texto, nombres de tabla de base de datos, nombres de carpeta, nombres de archivos, extensiones de archivos,
nombres de ruta, URLs ficticias, de entrada del usuario, y mangos de Twitter se muestran como sigue: "Podemos incluir otros contextos a
través del uso de la incluir . Directiva" Un bloque de código se establece de la siguiente manera:
Observable
. justo ( 'R', 'x', 'J', 'una', 'v' 'a')
. suscribirse (System.out ::
impresión, System.err :: println,
System.out :: println
);
[Vii]
Prefacio
Cuando deseamos llamar su atención sobre una parte específica de un bloque de código, las líneas o los artículos pertinentes
se exponen en negrita:
Los nuevos términos y Palabras importantes se muestran en negrita. Palabras que se ven en la pantalla, por ejemplo, en los
menús y cuadros de diálogo, aparecerá en el texto como este: "Interfaces de este tipo se denominan interfaces funcionales ".
comentarios de los lectores es importante para nosotros, ya que nos ayuda a desarrollar títulos que usted realmente va a obtener el
máximo provecho de. Para enviar comentarios generales, sólo tiene que enviar un correo electrónico feedback@packtpub.com , y
Si hay un tema que tiene experiencia y está interesado en cualquiera de escritura o contribuir a un libro, ver
nuestra guía de Autor www.packtpub.com/authors.
Atención al cliente
Ahora que usted es el orgulloso propietario de un libro Packt, tenemos una serie de cosas para ayudarle a obtener el
máximo provecho de su compra.
[Viii]
Prefacio
y registrarse para tener los archivos enviados por correo electrónico directamente a usted.
Errata
Aunque hemos tomado todas las precauciones para asegurar la exactitud de nuestro contenido, los errores ocurren. Si
encuentra un error en uno de nuestros libros, tal vez un error en el texto o el código-estaríamos agradecidos si pudiera
informar de esto a nosotros. Al hacerlo, puede ahorrar otros lectores de la frustración y ayudar a mejorar las versiones
posteriores de este libro. Si encuentra alguna errata, por favor informe al visitar http: //www.packtpub. com /
presentar-erratas, la selección de su libro, hacer clic en el Formulario de Presentación de erratas
vincular, y entrar en los detalles de su fe de erratas. Una vez que sus erratas se verifican, su presentación será
aceptado y la fe de erratas se cargará en nuestra página web o añadir a cualquier fe de erratas existentes en la
sección de erratas de ese título. Para ver la fe de erratas presentada anteriormente, vaya a https://www.packtpub.com/books/
contenido / soporte y escriba el nombre del libro en el campo de búsqueda. La información requerida aparecerá bajo
el Errata sección.
Piratería
La piratería de material con copyright en Internet es un problema constante en todos los medios. En Packt, tomamos la protección
de nuestros derechos de autor y licencias muy en serio. Si se encuentra con todas las copias ilegales de nuestros trabajos en
cualquier forma en Internet, por favor nos proporcione la dirección de ubicación o el nombre del sitio web inmediatamente para
que podamos presentar un recurso. Por favor, póngase en contacto con nosotros en copyright@packtpub.com con un enlace al
Apreciamos su ayuda en la protección de nuestros autores y nuestra capacidad para lograr que el contenido valioso.
preguntas
Si usted tiene un problema con cualquier aspecto de este libro, puede ponerse en contacto con nosotros en
[Ix]
Una introducción a Reactiva
Programación
Hoy en día, el término la programación reactiva es una tendencia. Las bibliotecas y los marcos en varios lenguajes
de programación están surgiendo. Se están creando blogs, artículos y presentaciones sobre la programación
reactiva. Las grandes empresas, como Facebook, Soundcloud, Microsoft y Netflix, están apoyando y el uso de este
concepto. Así que, como programadores, están comenzando a preguntarse sobre ella. ¿Por qué la gente se anime
así acerca de la programación reactiva? ¿Qué significa ser reactiva? ¿Sería útil en nuestros proyectos? ¿Hay que
aprender a usarlo?
Mientras tanto, Java es popular con su multi-threading, velocidad, fiabilidad y buena portabilidad. Se utiliza para la construcción de
una amplia variedad de aplicaciones, desde los motores de búsqueda, a través de bases de datos a las aplicaciones web complejas
que se ejecutan en los clústeres de servidores. Pero Java tiene mala fama demasiado, es muy difícil escribir dos aplicaciones
simultáneas y simples usando sólo la incorporada en las herramientas, y la programación en Java requiere escribir mucho código
repetitivo. Además, si tiene que ser asíncrona (utilizando futuros, por ejemplo), se puede conseguir fácilmente en el "infierno de
devolución de llamada", que en realidad es válido para todos los lenguajes de programación.
En otras palabras, Java es potente y se puede crear grandes aplicaciones con él, pero no va a ser fácil. La
buena noticia es que hay una manera de cambiar eso, utilizando el estilo de la programación reactiva. Este libro
presentará RxJava ( https://github.com/ReactiveX/RxJava), un código abierto de Java aplicación del paradigma de
programación reactiva. Escribir código usando RxJava requiere un tipo diferente de pensar, sino que le dará el
poder de crear una lógica compleja usando simples trozos de código bien estructurado.
[1]
Una introducción a la programación reactiva
Un ejemplo sencillo de esto es Microsoft Excel. Si establece un número en la celda A1 y otro número en la celda 'B1', y el
conjunto de células 'C1' a SUM (A1, B1); siempre 'A1' o los cambios 'B1', 'C1' se actualizarán para ser su suma. la llamada
¿Cuál es la diferencia entre la asignación de una variable simple C que es igual a la suma de las un y si variables
y el método de suma reactiva?
En un programa Java normal, cuando cambiamos 'a' o 'b', tendremos que actualizar 'c' nosotros mismos. En
otras palabras, el cambio en el flujo de los datos representados por 'a' y 'b', no se propaga a 'c'. Aquí se ilustra
este a través de código fuente:
System.out.println (c); // 9
a = 6;
System.out.println (c);
// 9 de nuevo, pero si 'c' fue el seguimiento de los cambios en 'a' y 'b', // hubiera sido 6 + 5 = 11
Puede descargar los archivos de código de ejemplo para todos los libros Packt haya adquirido de su
cuenta en http://www.packtpub.com. Si ha adquirido este libro otra parte, se puede visitar http:
//www.packtpub. es / support y registrarse para tener los archivos enviados por correo electrónico
directamente a usted.
[2]
Capítulo 1
Esta es una explicación muy sencilla de lo que "ser reactivos" significa. Por supuesto, hay varias
implementaciones de esta idea y hay varios problemas que deben resolver estas implementaciones.
Mientras que hace 10-15 años era normal que los sitios web que pasar por el mantenimiento o para tener un tiempo de
respuesta lento, hoy todo debe estar en línea 24/7 y debe responder con la velocidad del rayo; si es lento o hacia abajo, los
usuarios prefieren un servicio alternativo. Hoy en día los medios lentos inutilizables o rotas. Estamos trabajando con un
mayor volumen de datos que necesitamos para servir y procesar rápidamente.
HTTP fallos no eran algo raro en el pasado reciente, pero ahora, tenemos que ser tolerante a fallos y dar a nuestros
usuarios actualizaciones de mensajes legibles y razonables. En el pasado, escribimos aplicaciones de escritorio
simples, pero hoy escribimos aplicaciones web, que debe ser rápido y sensible. En la mayoría de los casos, estas
aplicaciones se comunican con un gran número de servicios a distancia.
Estos son los nuevos requisitos que tienen que cumplir si queremos que nuestro software sea competitivo. Así, en
otras palabras, tenemos que ser:
• Modular / dinámica: De esta manera, podremos tener 24/7 sistemas, ya que los módulos pueden ir fuera de
línea y en línea llegado sin romper o detener todo el sistema. Además, esto nos ayuda a estructurar mejor
nuestras aplicaciones a medida que se hacen más grandes y gestionar su base de código.
• Escalable: De esta manera, vamos a ser capaces de manejar una gran cantidad de datos o un gran número de
solicitudes de los usuarios.
• Podemos llegar a ser modular, si nuestro sistema es evento conducido. Podemos dividir el sistema en
múltiples micro-servicios / componentes / módulos que se va a comunicar entre sí utilizando las
notificaciones. De esta manera, vamos a reaccionar ante el flujo de datos del sistema, representado por
las notificaciones.
• Para ser medios escalables para reaccionar a los datos cada vez mayores, que reaccionan a la carga sin
desmoronarse.
[3]
Una introducción a la programación reactiva
• Como reacción a los fallos / errores hará que el sistema sea más tolerante a fallos.
• Para ser medios sensibles que reaccionan a la actividad del usuario en el momento oportuno. Si la solicitud es
dirigida por eventos, puede ser desacoplada en múltiples componentes autónomos. Esto nos ayuda a ser más escalable,
porque siempre podemos añadir nuevos componentes o eliminar los viejos sin parar o romper el sistema. Si los errores y
los fracasos se pasan al componente de la derecha, que puede manejar como las notificaciones, la aplicación puede
llegar a ser más tolerante a fallos o flexible. Así que si construimos nuestro sistema a ser controlado por eventos,
podemos lograr más fácilmente escalabilidad y tolerancia a fallos, y una solución escalable, desacoplado, y la aplicación
a prueba de errores es rápido y sensible para los usuarios.
Sensible
Elástico escalable
Evento conducido
los Manifiesto reactiva ( http://www.reactivemanifesto.org/) es un documento que define los cuatro principios reactivos
que hemos mencionado anteriormente. Cada sistema reactivo debe ser controlado por mensajes (dirigido por
eventos). De esa manera, puede convertirse imprecisa y por lo tanto escalable y elástico (tolerante a fallos), que
significa que es fiable y sensible (véase el diagrama anterior).
Tenga en cuenta que el reactivo Manifiesto describe un sistema reactivo y no es lo mismo que nuestra definición de la
programación reactiva. Se puede construir un mensaje impulsada, resistente, escalable, y la aplicación responde sin necesidad
de utilizar una biblioteca o lenguaje reactiva. Los cambios en los datos de aplicación pueden ser modelados con las
notificaciones, las cuales se pueden propagar a los manipuladores de la derecha. Por lo tanto, la escritura de aplicaciones
[4]
Capítulo 1
La introducción de RxJava
Para escribir programas reactivos, necesitamos una biblioteca o un lenguaje de programación específico, debido a la
construcción de algo así a nosotros mismos es una tarea bastante difícil. Java no es realmente un lenguaje de
programación reactiva (que proporciona algunas herramientas como el java.util. Observable clase, pero son bastante
limitadas). Es un lenguaje orientado a objetos de tipos estáticos, y escribir una gran cantidad de código repetitivo para
lograr cosas simples (POJO, por ejemplo). Pero hay bibliotecas reactivos en Java que podemos utilizar. En este libro,
vamos a utilizar RxJava (desarrollado por la gente en la comunidad de código abierto de Java, guiado por Netflix).
Por supuesto, también puede descargar el archivo JAR creado previamente. Para este libro, vamos a estar utilizando la versión 1.0.8.
Si utiliza Maven, puede agregar RxJava como una dependencia a su pom.xml archivo:
<Dependency>
<GroupId> io.reactivex </ groupId> <artifactId>
rxjava </ artifactId> <versión> 1.0.8 </ version> </
dependency>
Alternativamente, para Apache Ivy, poner este fragmento en dependencias de su archivo Hiedra:
{dependencias
. . .
compilación 'io.reactivex: rxjava: 1.0.8'
. . .
}
[5]
Una introducción a la programación reactiva
Los ejemplos y programas que acompañan a este libro de código pueden ser
construidos y probados con Gradle. Se puede descargar desde este repositorio
Github: https://github.com/meddle0x53/ aprendizaje-rxjava.
Ahora, vamos a echar un vistazo a lo RxJava se trata. Vamos a empezar con algo bien conocido, y
obtener gradualmente en los secretos de la biblioteca.
Como programador de Java, es muy posible que usted ha oído o utilizó el iterador
modelo. La idea es simple: una iterador ejemplo se utiliza para atravesar a través de un recipiente (colección / fuente de
datos / generador), tirando de los elementos del recipiente de uno en uno cuando se requiere, hasta que alcanza el
extremo del recipiente. Aquí hay un pequeño ejemplo de cómo se utiliza en Java:
List <String> list = Arrays.asList ( "uno", "dos", "tres", "cuatro", "cinco"); // (1)
Cada java.util.Collection objeto es una iterable instancia que significa que tiene el método iterador (). Este método
crea una iterador ejemplo, que tiene como su fuente de la colección. Echemos un vistazo a lo que hace el
código anterior:
[6]
Capítulo 1
las cuerdas. En este ejemplo, nuestro programa consume los elementos de la Lista instancia utilizando el
iterador ejemplo. Se tira de los datos (en este caso, representados por cuerdas) y las secuencias de roscado actuales
hasta los datos solicitados está listo y recibidos. Así, por ejemplo, si el
iterador instancia estaba disparando una petición a un servidor web en cada siguiente() método de llamada, el hilo principal
de nuestro programa sería bloqueada a la espera de cada una de las respuestas a llegar.
bloques de construcción de RxJava son los observables. los Observable clase (nota que este no es el java.util.Observable
clase que viene con el JDK) es el doble de la matemática iterador clase, lo que básicamente significa que son
como las dos caras de la misma moneda. Tiene una colección subyacente o cálculo que produce valores que
pueden ser consumidos por un consumidor. Pero la diferencia es que el consumidor no "pull" estos valores
desde el productor al igual que en el iterador modelo. Es exactamente lo contrario; los productores '' empuja los
valores como notificaciones al consumidor. Este es un ejemplo del mismo programa pero escrito utilizando una Observable
ejemplo:
List <String> list = Arrays.asList ( "uno", "dos", "tres", "cuatro", "cinco"); // (1)
[7]
Una introducción a la programación reactiva
4. Por lo tanto, cada cuerda de la lista fuente será empujado a través de la llamada()
método, y que será impreso. Las instancias de la RxJava Observable se comportan de clase algo
así como iteradores asíncronos, que notifiquen que hay un valor próximo a sus abonados / consumidores
por sí mismos. De hecho, la Observable clase se suma a la clásica Observador patrón (implementado en
Java-see java.util.Observable, ver Patrones de diseño: Elementos de software orientado a objetos reutilizables por la
Banda de los Cuatro) dos cosas disponibles en el iterable tipo.
• La capacidad para señalar al consumidor que no hay más datos disponibles. En lugar de llamar al hasNext
() método, se puede conectar a un abonado para escuchar un " OnCompleted' notificación.
[8]
Capítulo 1
nueva Action0 () {
@Anular
llamada public void () {
System.out.println ( "Hemos finnished!"); // (2)}
});
1. Si hay un error al procesar los elementos, las Observable instancia enviará este error a través de la llamar
(Throwable) método de esta oyente. Esto es análogo al bloque try-catch en el iterador ejemplo
instancia.
Vimos cómo podemos utilizar la Observable instancias y que no son tan diferentes de algo familiar para
nosotros, la iterador ejemplo. Estas Observable casos se pueden utilizar para la construcción de flujos asíncronos
y empujando actualizaciones de datos a sus suscriptores (que puede tener múltiples abonados) .Esta es una
implementación del paradigma de programación reactiva. Los datos se propaga a todas las partes interesadas:
los suscriptores.
Codificación usando tales corrientes es una implementación más funcional como de la programación reactiva. Por
supuesto, hay definiciones formales y términos complejos para ella, pero esta es la explicación más simple.
La suscripción a eventos debe estar familiarizado; por ejemplo, al hacer clic en un botón en una aplicación GUI dispara un evento que se
propaga a los suscriptores manipuladores. Sin embargo, el uso de RxJava, podemos crear flujos de datos de entrada de cualquier cosa,
archivo, tomas de corriente, las respuestas, las variables, cachés, las entradas del usuario, y así sucesivamente. Además de eso, los
consumidores pueden recibir una notificación de que la corriente está cerrado, o que se ha producido un error. Así, mediante el uso de estas
[9]
Una introducción a la programación reactiva
En resumen, una corriente es una secuencia de curso mensajes / eventos, ordenados a medida que se procesan en
tiempo real. Puede ser considerado como un valor que está cambiando a través del tiempo, y estos cambios pueden ser
observados por los suscriptores (consumidores), que dependen de ella. Así, volviendo al ejemplo de Excel, hemos
reemplazado con eficacia las variables tradicionales con "variables" o reactivos de RxJava Observable instancias.
• Cuando tanto el un y si colectores tienen valores iniciales, su suma será automáticamente calculada y
se imprime en la salida estándar en el formato
a + b = <sum>. En cada cambio de un o si, la suma se actualizará y se imprime.
El código fuente contiene características que vamos a discutir en detalle en los siguientes cuatro capítulos.
[10]
Capítulo 1
1. Lo primero que tenemos que hacer es crear una Observable ejemplo, que representa
el flujo de entrada estándar ( System.in). Por lo tanto, se utiliza el a partir de (InputStream)
método (aplicación será presentado en el próximo fragmento de código) para crear una ConnectableObservable
variable de la System.in. los
ConnectableObservable variable es una Observable instancia y comienza a emitir eventos procedentes de
su fuente sólo después de su conectar() método se llama. Leer más sobre ella en Capítulo 3, Creación y
conexión de los observables, observadores, y los sujetos.
Este código es responsable de la construcción de dependencias en el programa e iniciar apagado. los un y si Los
valores dependen de la entrada del usuario y su suma es dependiente de ellos.
Ahora vamos a ver la aplicación de la a partir de (InputStream) método, que crea una Observable instancia con
el java.io.InputStream fuente:
línea de cuerda;
while (! subscriber.isUnsubscribed () &&
(Línea = reader.readLine ())! = Null) {// (4)
si (== || line.equals línea nula ( "salida")) {// (5)
descanso; }
[11]
Una introducción a la programación reactiva
}).publicar(); // (9)}
Esta es una pieza compleja de código, así que vamos a ver de paso a paso:
4. La lógica principal es escuchar la entrada del usuario, mientras que el abonado está suscrito. Cada línea que el
usuario entra en el terminal es tratado como un mensaje. Este es el bucle principal del programa.
6. De lo contrario, el mensaje que el usuario introducido es pasado como una notificación al abonado de
la Observable ejemplo, utilizando el onNext (T) método. De esta manera, se pasa todo a las partes
interesadas. Es su trabajo para filtrar y transformar los mensajes primas.
7. Si hay un error IO, los suscriptores son notificados con una OnError
la notificación a través de la onError (Throwable) método.
[12]
Capítulo 1
8. Si el programa llega aquí (a través de romper el bucle principal) y el abonado todavía está suscrito a
la Observable ejemplo, una OnCompleted
se envía una notificación a los abonados que utilizan la OnCompleted () método.
Esto ilustra una forma simplificada para convertir flujos de IO en Java Observable instancias. Por supuesto, con este
bucle principal, el hilo principal del programa bloqueará esperando la entrada del usuario. Esto se puede prevenir
mediante la derecha Programador casos para mover la lógica a otro hilo. Volveremos a este tema en Capítulo 6, Usar la
concurrencia y paralelismo con programadores.
Ahora, cada línea el usuario escribe en el terminal se propaga como una notificación de la ConnectableObservable
instancia creada por este método. Ha llegado el momento de ver cómo nos conectamos nuestro valor Observable
casos, representa los colectores de la suma, a esta entrada Observable ejemplo. Aquí está la aplicación de la
public static observable <Double> varStream (última cadena varName, observable <String> entrada) {
patrón final Patrón = Pattern.compile ( "\\ ^ s *" + + varName "\\ s * [: | =]?.? s \\ * (- d + \\ \\ \\ d *) $") ; //
(1) de entrada de retorno
[13]
Una introducción a la programación reactiva
}});
}
los mapa() y filtrar() métodos llamados en el Observable ejemplo aquí son parte de la API fluida proporcionada por
RxJava. Se les puede llamar en una Observable ejemplo, la creación de un nuevo Observable instancia que depende de
estos métodos y que transforma o filtra los datos entrantes. El uso de estos métodos de la manera correcta, puede
expresar una lógica compleja en una serie de pasos que conducen a su objetivo. Lea más sobre esto en Capítulo 4, La
transformación, filtrado, y la acumulación de sus datos. Vamos a analizar el código:
1. Nuestros variables están interesados sólo en los mensajes en el formato < var_name>:
<Valor> o < var_name> = <valor>, por lo que vamos a utilizar esta expresión regular para filtrar y procesar
sólo este tipo de mensajes. Recuerde que nuestra entrada Observable ejemplo envía cada línea escribe el
usuario; es nuestro trabajo para manejar de la manera correcta.
2. El uso de los mensajes que recibimos de la entrada, se crea una matcher ejemplo
usando la expresión regular anterior como un patrón.
3. Pasamos a través de sólo datos que coincidan con la expresión regular. Todo lo demás se descarta.
4. Aquí, el valor de conjunto se extrae como una Doble valor numérico. Así es como los valores un y si están
representados por las corrientes de valores dobles, cambiando en el tiempo. Ahora podemos poner en práctica su
suma. Hemos implementado como una clase que implementa la Observador interfaz, porque quería mostrar otra forma
de suscribirse a Observable instancias-utilizando la Observador interfaz. Aquí está el código:
estáticas pública implementos ReactiveSum clase final Observador <Double> {// (1)
[14]
Capítulo 1
}
onError public void (Throwable e) {
System.err.println ( "Tienes un error!"); // (3)
e.printStackTrace ();
}
onNext pública vacío (suma Doble) {
this.sum = suma;
System.out.println ( "actualización: a + b =" + suma); // (2)}}
2. En nuestro onNext (Doble) implementación del método, se establece la suma al valor de entrada e
imprimir una actualización a la salida estándar.
actualización: a + b = 9,0
[ 15 ]
Una introducción a la programación reactiva
a: 6
actualización: a + b = 11,0
¡Así que esto es todo! Hemos puesto en marcha nuestra suma reactiva utilizando flujos de datos.
El código fuente de este ejemplo puede ser descargado y probado desde aquí: https://github.com/meddle0x53/learning-rxjava/
blob / master / src / main / java / com / packtpub / reactiva / Chapter01 / ReactiveSumV1.java.
Resumen
En este capítulo, nos fuimos a través de los principios reactivos y las razones por las que deben aprender y utilizar. No es
tan duro para construir una aplicación de reactivos; que sólo requiere la estructuración del programa en pequeños pasos
declarativas. Con RxJava, esto se puede lograr mediante la creación de múltiples flujos asíncronos conectados de la manera
correcta, la transformación de los datos de todo el camino a través de su consumo.
Los dos ejemplos que se presentan en este capítulo pueden parecer un poco complejo y confuso a primera vista,
pero en realidad, son bastante simples. Hay un montón de cosas nuevas en ellos, pero todo se explicarán en detalle
en los siguientes capítulos. Si desea obtener más información sobre la programación reactiva, echar un vistazo a Programación
reactiva en la API de Netflix con RxJava, un buen artículo sobre el tema, disponible en
Y estas son las diapositivas acerca de la programación reactiva y RX por Ben Christensen, uno de los
creadores de RxJava: https://speakerdeck.com/benjchristensen/ reactiva de programación-con-rx-en-qconsf-2014.
En el siguiente capítulo, vamos a hablar sobre algunos de los conceptos de la programación funcional y su
aplicación en Java 8. Esto nos dará las ideas básicas necesarias en el resto de los capítulos y nos ayudará a
deshacernos de la verbosidad de Java cuando se escriben programas reactivos.
[ dieciséis ]
El uso de las construcciones
funcionales de Java 8
La programación funcional no es una idea nueva; En realidad, es bastante antigua. Por ejemplo,
Ceceo, que es un lenguaje funcional, es la segunda más antigua de lenguajes de programación comúnmente usados en la
actualidad.
Los programas funcionales se construyen con pequeños trozos de funciones puras reutilizables (lambdas). La lógica del
programa se compone de pequeños pasos declarativas y algoritmos no complejos. Esto se debe a los programas
funcionales minimizar el uso de estado, lo que hace que los programas imperativos complejo y difícil de refactor / apoyo.
Con Java 8, el mundo Java tiene las expresiones lambda y la capacidad de pasar funciones a las funciones. Con ellos,
podemos codificar en un estilo más funcional y deshacerse de una gran parte del código repetitivo. La otra cosa nueva
que conseguimos con Java 8 es la corrientes, algo muy similar a los observables de RxJava pero no asíncrona. La
combinación de estas corrientes y las lambdas, somos capaces de crear programas más funcional-como.
Vamos a familiarizarnos con estas nuevas construcciones y vistazo a la forma en que se pueden utilizar con las
abstracciones de RxJava. Nuestros programas será más simple y más fácil de seguir utilizando el lambdas, y los
conceptos presentados en este capítulo serán de ayuda, mientras que el diseño de aplicaciones. Este capítulo
comprende:
• Lambdas en Java 8
[17]
El uso de las construcciones funcionales de Java 8
Lambdas en Java 8
El cambio más importante en Java 8 es la introducción de expresiones lambda. Permiten rápida, clara de codificación y
hacen posible el uso de la programación funcional. Java fue creado en los años 90 como un lenguaje de programación
orientado a objetos, con la idea de que todo debe ser un objeto. En ese momento, la programación orientada a objetos
fue el paradigma principal para el desarrollo de software. Sin embargo, recientemente, la programación funcional se ha
convertido cada vez más popular debido a que es muy adecuado para la programación concurrente y por eventos. Esto
no significa que debemos dejar de escribir código con lenguajes orientados a objetos. En lugar de ello, la mejor estrategia
es mezclar elementos de la programación orientada a objetos y funcional. La adición de lambdas a Java 8 lazos con esta
idea en Java es un lenguaje orientado a objetos, pero ahora tiene lambdas, somos capaces de código utilizando el estilo
funcional también. Echemos un vistazo a esta nueva función en detalle.
// (3)
public static <V, M> Lista <M> mapa (List <V> lista, Mapper <V, M> mapeador) {
Lista <M> mapeado = new ArrayList <M> (list.size ()); // (4) para (V v: lista) {
[18]
Capitulo 2
2. Tiene sólo un método, mapa M (V), que recibe un valor de tipo V y lo transforma en un valor
de tipo METRO.
3. El método estático Lista <M> mapa (List <V>, Mapper <V, M>) tiene una lista
con elementos de tipo V y una Mapper implementación. Usando esto Mapper
de implementación mapa() método en cada elemento de la lista de fuentes, convierte la lista para una nueva lista
de tipo METRO que contiene los elementos transformados.
4. La aplicación crea una nueva lista vacía de tipo METRO con el mismo tamaño que
la lista de fuentes.
En esta implementación, cada vez que desea crear una nueva lista mediante la transformación de otra, tendremos que
poner en práctica el Mapper interactuar con la transformación derecha. Hasta Java 8, la forma correcta de pasar lógica
personalizada a los métodos era exactamente así, con instancias de clases anónimas, la aplicación de los métodos que se
indican. Pero Echemos un vistazo a cómo utilizamos esta Lista <M> mapa (List <V>, Mapper <V, M>) método:
@Anular
pública Entero mapa (valor entero) {
Valor de retorno Valor *; // mapeo real
}});
Con el fin de solicitar una asignación a una lista, tenemos que escribir cuatro líneas de código repetitivo. El mapeo real es
muy simple y es sólo una de estas líneas. El verdadero problema aquí es que en lugar de pasar una acción, estamos
pasando un objeto. Esto oscurece la verdadera intención de este programa para pasar una acción que produce la
transformación de todos los elementos de la lista de fuentes y para obtener una lista con los cambios aplicados al final.
Esto es lo que esta llamada se parece a usar la nueva sintaxis lambda de Java 8:
[19]
El uso de las construcciones funcionales de Java 8
Bastante sencillo, ¿verdad? Y simplemente funciona. En lugar de pasar un objeto y la implementación de una
interfaz, se pasa un bloque de código, una función sin nombre. Que esta pasando? Definimos una interfaz
arbitraria con un método arbitrario, pero podríamos pasar este lambda en lugar de una instancia de la
interfaz. En Java 8, si se define interfaz con sólo un método abstracto y se crea un método que recibe un
parámetro de este tipo de interfaz, puede pasar una vez lambda. Si el método de interfaz única toma dos
argumentos de tipo cadena y devuelve un valor entero, el lambda tendrá que estar compuesto de dos
argumentos ante el -> y volver entero, los argumentos se infiere como cadenas. Interfaces de este tipo se
denominan interfaces funcionales. Es importante que el único método que sea abstracto y no por defecto.
Otra cosa nueva en Java 8 es el método por defecto de las interfaces:
Programa de interfaz de {
defecto Cadena fromChapter () {
volver "Dos"; }}
Los métodos por defecto son útiles cuando se cambia las interfaces ya existentes. Cuando añadimos métodos
predeterminados a ellos, las clases que implementan ellos no se romperán. Una interfaz con sólo un método por
defecto no es funcional; un solo método no debería ser por defecto.
Lambdas actúan como implementaciones de las interfaces funcionales. Por lo tanto, es posible asignarlos a variables de
tipo de interfaz de la siguiente manera:
Y podemos reutilizar el objeto cuadrado, ya que es una implementación de la Mapper interfaz. Tal vez usted ha notado,
pero en los ejemplos hasta ahora, los parámetros de las expresiones lambda no tienen ningún tipo. Esto es debido a
que los tipos se infieren. Por lo que esta expresión es absolutamente la misma que la expresión anterior:
El hecho de que el ejemplo con un parámetro sin un tipo de obras no es magia. Java es un lenguaje de tipos
estáticos, por lo que el parámetro del método único de la interfaz funcional se utiliza para la comprobación de tipos.
[20]
Capitulo 2
¿Y el cuerpo de la expresión lambda? No hay regreso cualquier declaración. Resulta que estos dos
ejemplos son exactamente los mismos:
// y
Mapper <Integer, Integer> = cuadrados (valor) -> {
La primera expresión es sólo una forma corta de la segunda. Se prefiere que el lambda ser sólo una línea de
código. Pero si la expresión lambda contiene más de una línea, la única manera de definir que está utilizando el
segundo enfoque, así:
Bajo el capó, las expresiones lambda no son sólo la sintaxis de azúcar para las clases internas anónimas. Se llevan a
cabo para realizar rápidamente dentro de la máquina virtual de Java
( JVM), así que si su código está diseñado para ser compatible con Java solamente 8+, que sin duda debe usarlos. Su
idea principal es la de pasar alrededor de la conducta de la misma manera que se pasa de datos. Esto hace que su
programa legible más humano. Una última cosa relacionada con la nueva sintaxis es la capacidad de pasar a métodos y
asignar a las variables funciones y los métodos ya definidos. Vamos a definir una nueva interfaz funcional:
Podemos utilizarlo para ejecutar acciones arbitrarias para cada valor en una lista; por ejemplo, el registro de la lista. Aquí es un
método que utiliza esta interfaz:
public static <V> acto nulo (List <V> lista, Acción <V> acción) {
para (V v: lista) {
action.act (v); }}
[21]
El uso de las construcciones funcionales de Java 8
Este método es similar a la mapa() función. En él se recorre la lista y llama a la acción del pasado Actuar() Método de
cada elemento. Digamos que es el uso de un lambda que simplemente registra los elementos de la lista:
Esto es bastante simple, pero no es necesario debido a que el println () método se puede pasar en sí a la Actuar() método.
Esto se hace de la siguiente manera:
Esta es una sintaxis válida en Java 8-todo método puede convertirse en un lambda y se pueden asignar a una
variable o pasado a un método. Todos estos son válidas:
• Libro :: leer // método de instancia, pero hace referencia sin necesidad de utilizar una instancia real.
Ahora que nos hemos revelado la sintaxis lambda, que lo va a utilizar en nuestros ejemplos RxJava en lugar
de clases internas anónimas.
• Consumidor <T>: Esto representa una función que acepta un argumento y devuelve nada. Su
método abstracto es Void aceptar (T). A modo de ejemplo, podemos utilizarlo para asignar el System.out
:: println método a una variable, como sigue:
[22]
Capitulo 2
• Función <T, R>: Esto representa una función que acepta un argumento de un tipo dado y devuelve
un resultado de un tipo arbitrario. Su método abstracto es
R accept (T), y que puede ser utilizado para el mapeo. No necesitamos la Mapper
interconectar a todos! Vamos a echar un vistazo en el siguiente fragmento de código:
Función <Integer, String> ToStr = (valor) -> (valor + "!"); Lista <String cadena => mapa (enteros,
ToStr);
• Predicado <T>: Esto significa una función con sólo un argumento que devuelve un resultado booleano.
Su método abstracto es prueba booleana (T) y se puede utilizar para filtrar. Vamos a echar un vistazo al
siguiente código:
Hay una gran cantidad de interfaces funcionales similares a éstos; por ejemplo, una función con dos argumentos, o un
operador binario. Esto es de nuevo una función con dos argumentos, pero ambos del mismo tipo y devolver un resultado
con el mismo tipo. Ellos están ahí para ayudar a la reutilización lambdas en nuestro código.
Lo bueno es que es RxJava lambda compatibles. Esto significa que las acciones estábamos de paso a la suscribir método
son, de hecho, las interfaces funcionales! interfaces funcionales de RxJava están en el rx.functions paquete. Todos ellos
se extienden una base interfaz de marcador ( interfaz con no hay métodos, utilizados para la comprobación de tipos),
llamados
Función. Además, hay otra interfaz de marcador, que se extiende la Función
uno, llamado Acción. Se utiliza para los consumidores de la marca (funciones, nada de vuelta). RxJava tiene
Acción9 <T1, T2, T3, T4, T5, T6, T7, T8, T9> // Acción con nueve parámetros ActionN // Acción con número
arbitrario de parámetros
Pueden ser utilizados principalmente para las suscripciones ( action1 y Action0). los
Observable.OnSubscribe <T> parámetro, que vimos en Capítulo 1, Introducción a la programación reactiva, ( utilizado para
la creación de los observables personalizados) se extiende la Acción
interconectarse también.
Análogamente, hay once Función extensores que representan resultado de volver función. Son Func0 <R>, Func1
<T1, R> ... Func9 <T1, T2, T3, T4, T5, T6, T7, T8, T9
, R>, y FuncN <R>. Se utilizan para el mapeo, el filtrado, la combinación, y muchos otros propósitos.
[23]
El uso de las construcciones funcionales de Java 8
Cada método de operador y suscribir en RxJava es aplicable a una o más de estas interfaces. Esto significa que
podemos usar expresiones lambda en lugar de clases internas anónimas en RxJava en casi todas partes. A partir
de ahora, todos los ejemplos se utilizan lambdas con el fin de ser más fácil de leer y algo funcional. Ahora,
Echemos un vistazo a un ejemplo grande RxJava implementado con lambdas. Este es nuestro ejemplo
familiarizado reactiva Sum!
input.connect ();
La única diferencia es que vamos a adoptar un enfoque más funcional en el cálculo de nuestra suma y no a
mantener el mismo estado. No estaremos implementando el
Observador interfaz; En su lugar, vamos a pasar a lambdas de suscripción. Esta solución es mucho más limpio.
los CreateObservable.from (InputStream) método es muy parecido se utilizó anteriormente. Vamos a saltar y mirar el Observable
<Double> varStream (String, observable <String>) método, que crea la Observable
[24]
Capitulo 2
Este método es mucho más corto que anteriormente utilizado y se ve más simple. Pero semánticamente, es la
misma. Se crea una Observable ejemplo conectada a una fuente observable producir cadenas arbitrarias, y si una
cadena está en el formato que espera, extrae un número doble de ella y emite este número. La lógica
responsable de comprobar el formato de la entrada y extraer el número es de sólo cuatro líneas y está
representado por lambdas simples. Examinemos que:
1. Trazamos un lambda que crea una matcher instancia utilizando el patrón esperado
y la cadena de entrada.
3. Usando una mapa() operador, creamos una cadena de la matcher ejemplo, que
contiene sólo los datos de número que necesitamos.
1. Una vez más, se utiliza el combineLatest () método, pero esta vez la tercera
argumento es una lambda simple que implementa una suma.
° Hay un error
[25]
El uso de las construcciones funcionales de Java 8
Todo se hace más simple el uso de lambdas. Mirando el programa anterior, podemos ver que la mayor parte de la lógica se
compone de funciones pequeñas e independientes, encadenados utilizando otras funciones. Esto es lo que entendemos por
ser funcionales, para expresar nuestros programas usando tan pequeñas funciones reutilizables que tienen otras funciones y
las funciones de retorno y las abstracciones de datos, que transforman los datos de entrada usando cadenas de funciones
con el fin de producir el resultado deseado. Pero vamos a ver estas funciones en profundidad.
El enfoque de RxJava tiene muchas ideas funcionales incorporados, lo que es importante para nosotros aprender
cómo pensar en formas más funcionales con el fin de escribir aplicaciones más reactivos.
funciones puras
UN función pura es una función cuyo valor de retorno solamente está determinado por su entrada, sin observable efectos
secundarios. Si lo llamamos con los mismos parámetros norte tiempos, que van a obtener el mismo resultado cada
vez. Por ejemplo:
Predicado <Integer> incluso = (número) -> número% 2 == 0; int i = 50; while ((yo--)> 0) {
Cada vez, la función devuelve incluso Falso porque depende sólo de su entrada, que es el mismo cada vez y no
es ni siquiera.
[26]
Capitulo 2
Esta propiedad de las funciones puras se llama idempotencia. Idempotent funciones no dependen del tiempo, para que
puedan tratar los datos continuos como los flujos de datos infinitas. Y es así como los datos en constante cambio está
representado en RxJava ( Observable instancias).
Esta función no es puro, ya que se imprime en la salida de un mensaje cada vez que se llama. Por lo tanto, hace dos
cosas: se comprueba si el número es par, y se muestra un mensaje como un efecto secundario. Un efecto secundario es
cualquier posible salida observable la función se puede producir, por ejemplo, eventos de activación y lanzar excepciones
y de E / S, diferente de su valor de retorno. Un efecto secundario también cambia estados compartidos o argumentos
mutables.
Piénsalo. Si la mayor parte de su programa se compone de funciones puras, será fácil de escala y ejecutar partes
de ella en paralelo porque las funciones puras pueden no entran en conflicto entre sí y no cambiar el estado
compartido. Otra cosa que vale la pena mencionar en este apartado es inmutabilidad. Los objetos inmutables son
objetos que no pueden cambiar su estado. Un ejemplo bueno es el Cuerda clase en Java. los Cuerda casos no pueden
cambiarse; métodos incluso como subcadena
crear una nueva instancia de Cuerda sin modificar la llamada. Si pasamos de datos inmutables a una pura función,
podemos estar seguros de que cada vez que se llama a estos datos se devolverá el mismo. Con mudable objetos,
no es exactamente lo mismo cuando escribimos programas paralelos, porque un hilo puede cambiar el estado del
objeto. En este caso, la pura función devolverá un resultado diferente si se llama, y por lo tanto dejará de ser
idempotente.
Si almacenamos nuestros datos en los objetos inmutables y operar sobre ella usando funciones puras, la creación de
nuevos objetos inmutables en el proceso, vamos a estar a salvo de los problemas inesperados de concurrencia. No
habrá estado global y ningún estado mutable; todo va a ser simple y predecible.
[27]
El uso de las construcciones funcionales de Java 8
El uso de objetos inmutables es complicado; cada acción con ellos crea nuevas instancias, y esto podría comer hasta la
memoria. Sin embargo, existen métodos para evitar que; por ejemplo, reutilizar tanto como podamos de lo inmutable fuente, o
haciendo ciclos de vida de los objetos inmutables lo más corto posible (ya que los objetos del ciclo de vida cortos son amigables
con GC o el almacenamiento en caché). Los programas funcionales deben estar diseñados para trabajar con datos sin estado
inmutables.
programas complejos no pueden ser compuestos únicamente de funciones puras, pero siempre que sea posible, es
bueno para usarlos. En la aplicación de este capítulo de El Reactivo Suma,
pasamos a mapa(), filtrar(), y combineLatest () sólo funciones puras. Hablando de la mapa() y filtrar() funciones, los
Aquí está un ejemplo de una función superior que lleva parámetros de la función:
Se necesitan dos funciones de tipo T -> int / R -> int y algunos datos con el fin de llamar y resumir sus resultados.
Por ejemplo, podemos hacerlo de esta manera:
Pero la idea de funciones de orden superior es ser flexible. Por ejemplo, podemos utilizar el
highSum () función para un propósito completamente diferente, por ejemplo, la suma de las cadenas, como se muestra aquí:
[28]
Capitulo 2
Por lo tanto, una función de orden superior se puede utilizar para aplicar el mismo comportamiento para diferentes tipos de entrada.
Si los dos primeros argumentos que pasamos a la highSum () función son funciones puras, será una función pura
también. los strToInt parámetro es una función pura, y si llamamos a la highSum (strToInt, strToInt, "4", "5") método norte
veces, se le devolverá el mismo resultado y no tienen efectos secundarios. Aquí es otro ejemplo de una función
de orden superior:
Esta es una función que devuelve otra función. Se puede utilizar la siguiente manera:
System.out.println (. Greet ( "adiós") se aplica ( "mundo cruel")); // imprime 'Adiós mundo cruel!'
Funciones como éstas pueden ser utilizadas para implementar diferentes comportamientos que tienen algo en común. En la
programación orientada a objetos definimos las clases y luego extender ellos, la sobrecarga de sus métodos. En la
programación funcional, se definen las funciones de orden superior como interfaces y los llamamos con diferentes parámetros,
dando lugar a diferentes comportamientos. Estas funciones son ciudadanos de primera clase; podemos codificar nuestra lógica
usando sólo las funciones, el encadenamiento de ellos, y el manejo de nuestros datos, la transformación, la filtración, o
acumularlo en un resultado.
[29]
El uso de las construcciones funcionales de Java 8
los mapa() Devuelve un nuevo operador Observable ejemplo, emitiendo los datos transformados por ella. Los operadores como mapa()
son claramente las funciones de orden superior, y que pueden pasar a otras funciones a ellos. Por lo tanto, un programa
RxJava típico está representado por una cadena de operadores encadenado a una Observable instancia a la que múltiples suscriptores
pueden suscribirse. Estas funciones encadenadas pueden beneficiarse de los temas tratados en este capítulo.
Podemos pasar lambdas a ellos en lugar de implementaciones de interfaces anónimos (como vimos con la
segunda aplicación de la Suma reactiva),
y debemos tratar de trabajar con datos inmutables y funciones puras siempre que sea posible. De esta manera, nuestro
código será sencilla y segura.
Resumen
En este capítulo, hemos visto algunos de los principios y términos de programación funcional. Hemos aprendido
cómo escribir programas formados por pequeñas acciones función pura, encadenados juntos utilizando funciones de
orden superior.
Como la programación funcional es cada vez más popular, los desarrolladores competentes en que será de gran
demanda en un futuro muy próximo. Esto se debe a que nos ayuda a lograr escalabilidad y paralelismo con
facilidad. Y lo que es más, si añadimos la idea reactiva a la misma, se hace aún más atractivo.
Es por eso que vamos a bucear en el marco RxJava en los próximos capítulos, aprender a utilizar para
nuestro beneficio. Comenzaremos con la Observable técnicas de creación de instancias. Esto nos
proporcionará la habilidad para crear una Observable
instancia de todo, convirtiendo así a casi todo en un programa funcional reactivo.
[30]
Creación y
Conexión observables,
Observadores, y los sujetos
RxJava de Observable casos son los bloques de construcción de aplicaciones de reactivos, y esta ventaja de RxJava es
beneficioso. Si tenemos una fuente Observable ejemplo, podríamos lógica cadena a la misma y suscribir para el resultado.
Todo lo que necesitamos es este inicial
Observable ejemplo.
En el navegador o en una aplicación de escritorio, la entrada del usuario ya está representada por los eventos que
podemos manejar y hacia adelante a través Observable instancias. Pero sería muy bueno para convertir todos nuestros
cambios o acciones de datos en Observable casos, no sólo la entrada del usuario. Por ejemplo, cuando leemos datos de un
archivo, sería ordenada a mirar cada línea leída o cada secuencia de bytes como un mensaje de que se puede emitir a
través de una Observable ejemplo.
Pronto nos ocuparemos en detalle la forma en que las fuentes de datos diferentes pueden ser transformados en
Observable instancias; no importa si son externos (archivos o entradas de usuario) o internos (colecciones o
escalares). Lo que es más, vamos a aprender acerca de los distintos tipos de
Observable casos, dependiendo de su comportamiento. Otra cosa importante que vamos a aprender es cómo y
cuándo debe darse de baja Observable instancias y cómo utilizar las suscripciones y Observador instancias.
Además, vamos a presentar Tipo de materia y su uso.
• Observadores y suscriptores
[31]