10. Anexos
A continuación, explicamos cómo instalar las herramientas utilizadas en este documento en equipos con Windows 7 a 10. El lector deberá adaptarse a su propio entorno.
10.1. Instalación de un JDK
Encontraremos en el URL el [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (abril de 2016), el JDK más reciente. A partir de ahora, llamaremos <jdk-install> a la carpeta de instalación del JDK.
![]() |
10.2. Instalación del SDK Manager de Android
![]() |
- en [1], ¿por qué necesitamos el SDK de Android?
El SDK Manager de Android se encuentra en la dirección [https://developer.android.com/studio/index.html#downloads] (mayo de 2016).
![]() |
Realice la instalación del SDK Manager. A continuación, anotaremos <sdk-manager-install> como su directorio de instalación. Ejecútelo.
El proyecto se ha configurado para (véase el apartado 9.3.2):
- el SDK API 23 [2];
- el SDK Build-tools 23.0.3 [3] ;
- el SDK Tool 25.1.3 [4]
Asegúrese de haber descargado estos elementos.
10.3. Instalación del gestor de emuladores Genymotion
Los emuladores que vienen con Android son lentos, lo que desanima a usarlos. La empresa [Genymotion] ofrece un emulador de alto rendimiento. Este está disponible en URL [https://cloud.genymotion.com/page/launchpad/download/] (mayo de 2016).
Tendrá que registrarse para obtener una version para uso personal. Descargue el producto [Genymotion] con la máquina virtual VirtualBox:

A partir de ahora llamaremos <genymotion-install> a la carpeta de instalación de [Genymotion]. Ejecute [Genymotion]. A continuación, descargue una imagen para una tableta:
![]() |
- en [1], añada el terminal virtual descrito en [2];
10.4. Instalación de IDE IntellijIDEA Community Edition
El IDE [ Intellij IDEA Community Edition] está disponible en el URL [https://www.jetbrains.com/idea/#chooseYourEdition]:
![]() |
Instala el IDE y, a continuación, ejecútalo.
![]() | ![]() |
- En [1-2], configura los plugins;
- en [3-4], añada al IDE el complemento [Genymotion];
![]() |
- en [6-7], configure el IDE;
![]() | ![]() |
- en [8-9], indique la carpeta de instalación del gestor de emuladores [Genymotion];
![]() |
- en [12-13], se configura el tipo predeterminado de los proyectos;
![]() | ![]() |
![]() |
- en [14-16], se configura el JDK;
![]() |
![]() | ![]() |
- en [17-20], se configura el SDK de Android;
![]() |
- en [21-22], se indica el JDK por defecto de los proyectos;
![]() | ![]() |
![]() |
- en [23-27], se desactiva la corrección ortográfica, que por defecto está configurada para el idioma inglés;
![]() | ![]() |
- en [28-32], elija el tipo de atajos de teclado que desee. Puede mantener el predeterminado de Intellij o elegir el de otro IDE al que esté más acostumbrado;
![]() |
- en [33-35], configura el IDE para múltiples proyectos. Puede gestionar varios proyectos en la misma ventana o en ventanas diferentes;
![]() |
- en [36-37], numere las líneas de forma predeterminada. Esto le permitirá encontrar rápidamente la línea que ha provocado una excepción;
10.5. Uso de los ejemplos
Los proyectos de los ejemplos IntellijIDEA están disponibles |ICI|. El apartado 1.3 explica cómo abrirlos.
10.6. Gestión de jSON en Java
De forma transparente para el desarrollador, el marco [Spring MVC] utiliza la biblioteca JSON [Jackson]. Para ilustrar qué es JSON (JavaScript Object Notation), presentamos aquí un programa que serializa objetos en JSON y hace lo contrario al deserializar las cadenas JSON generadas para recrear los objetos iniciales.
La biblioteca «Jackson» permite construir:
- la cadena JSON de un objeto: new ObjectMapper().writeValueAsString(object);
- un objeto a partir de una cadena JSON: new ObjectMapper().readValue(jsonString, Object.class).
Ambos métodos pueden lanzar un IOException. A continuación se muestra un ejemplo.
![]() |
El proyecto anterior es un proyecto Maven con el siguiente archivo [pom.xml];
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>istia.st</groupId>
<artifactId>json</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
</project>
- líneas 12-16: la dependencia que incorpora la biblioteca «Jackson»;
La clase [Personne] es la siguiente:
package istia.st.json;
public class Personne {
// data
private String nom;
private String prenom;
private int age;
// constructores
public Personne() {
}
public Personne(String nom, String prénom, int âge) {
this.nom = nom;
this.prenom = prénom;
this.age = âge;
}
// firma
public String toString() {
return String.format("Personne[%s, %s, %d]", nom, prenom, age);
}
// getters y setters
...
}
La clase [Main] es la siguiente:
package istia.st.json;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class Main {
// la herramienta de serialización/deserialización
static ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
// creación de una persona
Personne paul = new Personne("Denis", "Paul", 40);
// visualización Json
String json = mapper.writeValueAsString(paul);
System.out.println("Json=" + json);
// instanciación de Persona a partir de Json
Personne p = mapper.readValue(json, Personne.class);
// Visualización de persona
System.out.println("Personne=" + p);
// una tabla
Personne virginie = new Personne("Radot", "Virginie", 20);
Personne[] personnes = new Personne[]{paul, virginie};
// visualización de Json
json = mapper.writeValueAsString(personnes);
System.out.println("Json personnes=" + json);
// diccionario
Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
hpersonnes.put("1", paul);
hpersonnes.put("2", virginie);
// visualización Json
json = mapper.writeValueAsString(hpersonnes);
System.out.println("Json hpersonnes=" + json);
}
}
La ejecución de esta clase produce la siguiente salida en pantalla:
Del ejemplo se desprende lo siguiente:
- el objeto [ObjectMapper] necesario para las transformaciones JSON / Objeto: línea 11;
- la transformación [Personne] --> JSON: línea 17;
- la transformación JSON --> [Personne]: línea 20;
- la excepción [IOException] lanzada por ambos métodos: línea 13.
Índice
1Introducción 5
1.2Les herramientas utilizadas 6
1.3Les códigos de los ejemplos 6
2Un ejemplo de introducción 9
2.1L: arquitectura de la aplicación de ejemplo 9
2.2L: el ejecutable 9
2.3L'interfaz síncrona 11
2.4L'llamada síncrona 12
2.5Tests de llamadas síncronas 13
2.6L: interfaz asíncrona y su implementación 14
2.7L «Llamada asíncrona» 16
2.8Tests: llamadas asíncronas 19
2.8.1avec el programador [Schedulers.io] 20
2.8.2avec el programador [Schedulers.computation] 20
2.8.3avec el programador [Schedulers.newThread] 21
2.8.4avec los programadores [Schedulers.trampoline, Schedulers.immediate] 22
2.9Cas límites 22
3Las firmas de las clases y métodos genéricos 27
4Las funciones lambda de Java 8 32
4.1Exemple-01 - Interfaces funcionales y lambdas 32
4.2Exemple-02 - La interfaz funcional Predicate<T> 34
4.3Exemple-03 - la interfaz funcional Function<T,R> 37
4.4Exemple-04 - la interfaz funcional Consumer<T> 38
4.5Exemple-05 - la interfaz funcional BiConsumer<T,U> 40
4.6Exemple-06 - la interfaz funcional BiFunction<T,U,R> 41
4.7Exemple-07 - la interfaz funcional Supplier<T> 43
5El tipo Stream<T> de Java 8 45
5.1Exemple-01 - la clase Stream 45
5.2Exemple-02 - procesamiento en paralelo de los elementos de un Stream 47
5.3Exemple-03 - Procesamiento en paralelo de los elementos de un Stream 48
5.4Exemple-04 - Filtrar un flujo 50
5.5Exemple-05 - Crear un Stream<T2> a partir de un Stream<T1> 52
5.6Exemple-06 - otros métodos de la clase Stream<T> 53
5.6.1[findFirst] 54
5.6.2[findAny] 55
5.6.3[skip] 56
5.6.4[limit] 58
5.6.5[count] 59
5.6.6[max, min] 60
5.6.7[reduce] 63
5.6.8[sorted] 63
5.6.9[anyMatch, noneMatch, allMatch] 65
5.6.10[collect(Collectors.groupingBy)] 65
5.6.11[distinct] 67
5.6.12[flatMap] 68
5.6.13 Métodos de flujo de números primitivos 71
6Interfaces funcionales de la biblioteca RxJava 72
6.1Exemple-01: la interfaz funcional [Action0] 72
6.2Exemple-02, 03: la interfaz funcional [Actioni] 73
6.3Exemple-04, 05: la interfaz funcional [Funci] 74
7La biblioteca RxJava 77
7.1 Crear observables y suscribirse a ellos 77
7.1.1Exemple-01: el método [Observable.from] 77
7.1.2Exemple-03: la clase Observer 82
7.1.3Exemple-04: el método [Observable.create] 84
7.1.4Exemple-05: refactorización de [Exemple-04] 86
7.2Thread de ejecución, subproceso de observación 88
7.2.1Exemple-06: observable y observador en un hilo distinto de [main] 88
7.2.2Exemple-07: observable y observador en dos subprocesos diferentes 90
7.3Observables predefinidos 92
7.3.1Exemple-08: el método [Observable.range] 92
7.3.2Exemple-09: los métodos Observable.[interval, take, doNext] 96
7.3.3Exemples-10/12: los métodos Observable.[error, empty, never] 98
7.4.1Exemple-13: subproceso de acción, subproceso de observación 103
7.5Combinaisons de varios observables 106
7.5.1Exemple-14: fusionar dos observables con [Observable.merge] 106
7.5.2Exemple-15: concatenar dos observables con [Observable.concat] 108
7.5.3Exemple-16: combinar dos observables con [Observable.zip] 109
7.5.4Exemple-17: combinar dos observables con [Observable.combineLatest] 111
7.5.5Exemple-18: combinar dos observables con [Observable.amb] 113
7.6 Cadena de procesamiento de un observable 114
7.6.1Exemple-19: transformar un observable con [Observable.map] 114
7.6.2Exemple-20: filtrar un observable con [Observable.filter] 116
7.6.3Exemple-21: transformar un observable con [Observable.flapMap] 117
7.6.4Exemples-22: otros métodos de la clase [Observable] 123
7.7Les programadores 127
7.7.1Exemple-23: el programador [Schedulers.computation] 127
7.7.2Exemple-24: el programador [Schedulers.io] 128
7.7.3Exemple-25: el programador [Schedulers.newThread] 129
7.7.4Exemple-26: los programadores [Schedulers.immediate, Schedulers.trampoline] 130
7.8Conclusion 133
8RxJava en el entorno Swing 134
8.1Introduction 134
8.2La estructura del código 135
8.3 Ejecución del proyecto 136
8.4Le servicio síncrono 136
8.5Le servicio asíncrono 139
8.6L «interfaz gráfica» 141
8.7Instanciation de la interfaz gráfica 143
8.8Ejecución de consultas sincrónicas 144
8.9 Ejecución de consultas asíncronas 145
9 RxJava en el entorno Android 149
9.1Introduction 149
9.2Le servicio web / jSON 149
9.2.1Le proyecto Intellij Idea 150
9.2.2Les dependencias Gradle del proyecto 151
9.2.3La capa [métier] 153
9.2.4Le servicio web / JSON 156
9.2.5Configuration del proyecto Spring 160
9.2.6Ejecución del servidor web 161
9.3Le cliente Android 161
9.3.1RxAndroid 161
9.3.2Le proyecto Intellij Idea 162
9.3.3 Ejecución del proyecto Intellij Idea 164
9.3.4Les Dependencias de Gradle del proyecto 166
9.3.5Le: manifiesto de la aplicación Android 167
9.3.6La capa [DAO] 168
9.3.6.1L: interfaz [IDao] de la capa [DAO] 168
9.3.6.2 Implementación de la capa [DAO] 170
9.3.7Les vistas de la aplicación 172
9.3.7.1La clase [MyFragment] 174
9.3.7.2Le fragmento [RequestFragment] de la consulta 176
9.3.7.3Le fragmento [ResponseFragment] de la respuesta 177
9.3.7.4L actividad de Android [MainActivity] 178
9.3.7.5Le fragmento [RequestFragment] 185
9.3.7.6Le fragmento [ResponseFragment] 187
9.3.8Les ejemplos de observables 190
9.3.8.6Pour continuar 202
9.3.9Conclusion 202
10Anexos 203
10.1Installation de un JDK 203
10.2Installation del SDK Gestor de Android 203
10.3Installation del gestor de emuladores Genymotion 204
10.4Installation del IDE IntellijIDEA Community Edition 205
10.5Utilisation de los ejemplos 210
10.6Gestion del jSON en Java 211

























