10. Anexos
Aquí te mostramos 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
En el URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (abril de 2016) se encuentra la versión más reciente del JDK. A partir de ahora, llamaremos <jdk-install> a la carpeta de instalación del JDK.
![]() |
10.2. Instalación del SDK Android Manager
![]() |
- 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 partir de ahora, nos referiremos a su directorio de instalación como <sdk-manager-install>. Ejecútelo.
El proyecto se ha configurado para (véase el párrafo 9.3.2):
- el SDK API 23 [2];
- el SDK Build-tools 23.0.3 [3];
- el SDK Tool 25.1.3 [4]
Asegúrate de haber descargado estos elementos.
10.3. Instalación del administrador de emuladores Genymotion
Los emuladores que vienen con Android SDK son lentos, lo que desmotiva su uso. 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ás que registrarte para obtener una versión para uso personal. Descarga el producto [Genymotion] junto con la máquina virtual VirtualBox:

A partir de ahora, llamaremos <genymotion-install> a la carpeta de instalación de [Genymotion]. Ejecuta [Genymotion]. A continuación, descarga una imagen para una tableta:
![]() |
- en [1], agrega el terminal virtual descrito en [2];
10.4. Instalación de IDE y IntellijIDEA Community Edition
El IDE [ Intellij IDEA Community Edition] está disponible en el URL [https://www.jetbrains.com/idea/#chooseYourEdition]:
![]() |
Instala el IDE y luego ejecútalo.
![]() | ![]() |
- En [1-2], configura los complementos;
- en [3-4], agrega al IDE el complemento [Genymotion];
![]() |
- en [6-7], configura el IDE;
![]() | ![]() |
- en [8-9], indique la carpeta de instalación del administrador 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 como valor predeterminado de los proyectos;
![]() | ![]() |
![]() |
- en [23-27], se desactiva el corrector ortográfico, que por defecto está configurado para el idioma inglés;
![]() | ![]() |
- en [28-32], elige el tipo de atajos de teclado que prefieras. Puedes mantener el predeterminado de IntelliJ o elegir el de otro IDE al que estés más acostumbrado;
![]() |
- en [33-35], configura el IDE para múltiples proyectos. Puede manejar varios proyectos en la misma ventana o en ventanas diferentes;
![]() |
- en [36-37], numere las líneas de forma predeterminada. Esto le permitirá localizar rápidamente la línea que provocó una excepción;
10.5. Uso de los ejemplos
Los proyectos de ejemplo IntellijIDEA están disponibles |ICI|. El párrafo 1.3 explica cómo abrirlos.
10.6. Manejo del jSON « » en Java
De manera transparente para el desarrollador, el marco [Spring MVC] utiliza la biblioteca JSON [Jackson]. Para ilustrar qué es el JSON (notación de objetos JavaScript), presentamos aquí un programa que serializa objetos en JSON y realiza el proceso inverso 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 que contiene 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 {
// datos
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 de JSON
String json = mapper.writeValueAsString(paul);
System.out.println("Json=" + json);
// instanciación de una persona a partir del JSON
Personne p = mapper.readValue(json, Personne.class);
// visualización de un usuario
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 de JSON
json = mapper.writeValueAsString(hpersonnes);
System.out.println("Json hpersonnes=" + json);
}
}
Al ejecutar esta clase, se muestra lo siguiente en pantalla:
De este ejemplo, cabe destacar:
- 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
1 Introducció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: llamadas síncronas 13
2.6L: la interfaz asíncrona y su implementación 14
2.7L «Llamada asíncrona» 16
2.8Tests: llamadas asincrónicas 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 Stream 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
6Las interfaces 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, hilo 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: hilo de acción, hilo 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 de usuario 143
8.8 Ejecución de consultas sincrónicas 144
8.9 Ejecución de consultas asincrónicas 145
9 RxJava en el entorno de Android 149
9.1Introduction 149
9.2Le servicio web / jSON 149
9.2.1Le proyecto IntelliJ IDEA 150
9.2.2Les dependencias de 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.6 Ejecució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 de IntelliJ IDEA 164
9.3.4Les: Dependencias de Gradle del proyecto 166
9.3.5Le: manifiesto de la aplicación para 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: la 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 Administrador de Android 203
10.3Installation del administrador de emuladores Genymotion 204
10.4Installation de IDE IntellijIDEA Edición Comunitaria 205
10.5Utilisation de los ejemplos 210
10.6Gestion del jSON en Java 211

























