Skip to content

10. Anexos

Aquí explicamos cómo instalar las herramientas utilizadas en este documento en equipos con Windows 7 a 10. Los lectores deben adaptar estas instrucciones a su propio entorno.

10.1. Instalación de un JDK

El JDK más reciente se puede encontrar en la URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (abril de 2016). En adelante, nos referiremos a la carpeta de instalación del JDK como <jdk-install>.

 

10.2. Instalación del Android SDK Manager

 
  • Consulte [1] para saber por qué necesitamos el SDK de Android;

El Administrador del SDK de Android se encuentra en [https://developer.android.com/studio/index.html#downloads] (mayo de 2016).

 

Instala el SDK Manager. Nos referiremos a su directorio de instalación como <sdk-manager-install> ( ). Ábrelo.

El proyecto se ha configurado para (véase la sección 9.3.2):

  • SDK API 23 [2];
  • Herramientas de compilación del SDK 23.0.3 [3];
  • la herramienta SDK 25.1.3 [4]

Asegúrate de haber descargado estos componentes.

10.3. Instalación del gestor del emulador Genymotion

Los emuladores que se incluyen con el SDK de Android son lentos, lo que desalienta su uso. La empresa [Genymotion] ofrece un emulador de alto rendimiento. Está disponible en la 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] con la máquina virtual VirtualBox:

Image

A partir de ahora nos referiremos a la carpeta de instalación de [Genymotion] como <genymotion-install>. Inicie [Genymotion]. A continuación, descargue una imagen para una tableta:

 
  • en [1], añade el terminal virtual descrito en [2];

10.4. Instalación del IDE IntelliJ IDEA Community Edition

El IDE [IntelliJ IDEA Community Edition] está disponible en [https://www.jetbrains.com/idea/#chooseYourEdition]:

 

Instala el IDE y, a continuación, ejecútalo.

  • En [1-2], configura los complementos;
  • En [3-4], añade el complemento [Genymotion] al IDE;
 
  • En [6-7], configura el IDE;
  • En [8-9], especifique la carpeta de instalación del gestor del emulador [Genymotion];
  • En [12-13], configura el tipo de proyecto predeterminado;
 
  • en [14-16], configura el JDK;
 
  • En [17-20], configura el SDK de Android;
 
  • En [21-22], especifique el JDK predeterminado para los proyectos;
 
  • En [23-27], desactive el corrector ortográfico, que está configurado en inglés de forma predeterminada;
  • En [28-32], elige el tipo de atajos de teclado que desees. Puedes mantener la configuración predeterminada de IntelliJ o elegir los de otro IDE al que estés 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], habilite la numeración de 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 IntelliJ IDEA para los ejemplos están disponibles |AQUÍ|. En la sección 1.3 se 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 deserializando las cadenas JSON generadas para recrear los objetos originales.

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 una 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 incluye la biblioteca «Jackson»;

La clase [Person] es la siguiente:


package istia.st.json;
 
public class Personne {
    // data
    private String nom;
    private String prenom;
    private int age;
 
    // manufacturers
    public Personne() {
 
    }
 
    public Personne(String nom, String prénom, int âge) {
        this.nom = nom;
        this.prenom = prénom;
        this.age = âge;
    }
 
    // signature
    public String toString() {
        return String.format("Personne[%s, %s, %d]", nom, prenom, age);
    }
 
    // getters and 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 {
  // the serialization / deserialization tool
  static ObjectMapper mapper = new ObjectMapper();
 
  public static void main(String[] args) throws IOException {
    // creation of a person
    Personne paul = new Personne("Denis", "Paul", 40);
    // json display
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // person instantiation from Json
    Personne p = mapper.readValue(json, Personne.class);
    // person display
    System.out.println("Personne=" + p);
    // a picture
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // json display
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // dictionary
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // json display
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

Al ejecutar esta clase se obtiene el siguiente resultado en pantalla:

1
2
3
4
Json={"nom":"Denis","prenom":"Paul","age":40}
Personne=Personne[Denis, Paul, 40]
Json personnes=[{"nom":"Denis","prenom":"Paul","age":40},{"nom":"Radot","prenom":"Virginie","age":20}]
Json hpersonnes={"2":{"nom":"Radot","prenom":"Virginie","age":20},"1":{"nom":"Denis","prenom":"Paul","age":40}}

Puntos clave del ejemplo:

  • el objeto [ObjectMapper] necesario para las transformaciones JSON/Object: línea 11;
  • la transformación [Person] --> JSON: línea 17;
  • la transformación de JSON a [Person]: línea 20;
  • la [IOException] lanzada por ambos métodos: línea 13.

Índice

1. Introducción 5

1.1 Antecedentes 5

1.2 Herramientas utilizadas 6

1.3 Los códigos de ejemplo 6

2Un ejemplo de introducción 9

2.1 La arquitectura de la aplicación de ejemplo 9

2.2 El ejecutable 9

2.3 La interfaz síncrona 11

2.4 La llamada síncrona 12

2.5 Pruebas de llamadas síncronas 13

2.6 La interfaz asíncrona y su implementación 14

2.7 La llamada asíncrona 16

2.8 Pruebas de llamadas asíncronas 19

2.8.1 con el programador [Schedulers.io] 20

2.8.2 con el programador [Schedulers.computation] 20

2.8.3 con el programador [Schedulers.newThread] 21

2.8.4 con los programadores [Schedulers.trampoline, Schedulers.immediate] 22

2.9 Casos extremos 22

2.10 Conclusión 24

3Firmas de clases y métodos genéricos 27

4Expresiones lambda de Java 8 32

4.1 Ejemplo-01: Interfaces funcionales y lambdas 32

4.2 Ejemplo-02: la interfaz funcional Predicate<T> 34

4.3 Ejemplo-03: la interfaz funcional Function<T,R> 37

4.4 Ejemplo-04: la interfaz funcional Consumer<T> 38

4.5 Ejemplo-05: la interfaz funcional BiConsumer<T,U> 40

4.6 Ejemplo-06: la interfaz funcional BiFunction<T,U,R> 41

4.7 Ejemplo-07: la interfaz funcional Supplier<T> 43

5El tipo Stream<T> en Java 8 45

5.1 Ejemplo-01: la clase Stream 45

5.2 Ejemplo 02: procesamiento paralelo de elementos de Stream 47

5.3 Ejemplo 3: Procesamiento paralelo de elementos de un flujo 48

5.4 Ejemplo 04: filtrado de un flujo 50

5.5 Ejemplo-05: Creación de un Stream<T2> a partir de un Stream<T1> 52

5.6 Ejemplo-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[recuento] 59

5.6.6[máx, mín] 60

5.6.7[reducir] 63

5.6.8[ordenado] 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 primitivos de la secuencia numérica 71

6Interfaces funcionales en la biblioteca RxJava 72

6.1 Ejemplo-01: La interfaz funcional [Action0] 72

6.2 Ejemplos 02 y 03: La interfaz funcional [Actioni] 73

6.3 Ejemplos 04 y 05: La interfaz funcional [Funci] 74

7La biblioteca RxJava 77

7.1 Creación y suscripción a observables 77

7.1.1 Ejemplo-01: El método [Observable.from] 77

7.1.2 Ejemplo-03: La clase Observer 82

7.1.3 Ejemplo-04: El método [Observable.create] 84

7.1.4 Ejemplo-05: Refactorización del [Ejemplo-04] 86

7.2 Hilo de ejecución, hilo de observación 88

7.2.1 Ejemplo-06: Observable y Observer en un hilo distinto de [main] 88

7.2.2 Ejemplo 07: Observable y observador en dos subprocesos diferentes 90

7.3 Observables predefinidos 92

7.3.1 Ejemplo-08: El método [Observable.range] 92

7.3.2 Ejemplo-09: Los métodos Observable.[interval, take, doNext] 96

7.3.3 Ejemplos 10/12: los métodos Observable.[error, empty, never] 98

7.4 Multiprocesamiento 102

7.4.1 Ejemplo 13: Hilo de acción, hilo de observación 103

7.5 Combinaciones de múltiples observables 106

7.5.1 Ejemplo 14: Fusión de dos observables con [Observable.merge] 106

7.5.2 Ejemplo 15: Concatenación de dos observables con [Observable.concat] 108

7.5.3 Ejemplo 16: Combinación de dos observables utilizando [Observable.zip] 109

7.5.4 Ejemplo 17: Combinación de dos observables con [Observable.combineLatest] 111

7.5.5 Ejemplo 18: Combinación de dos observables con [Observable.amb] 113

7.6 Cadena de procesamiento para un observable 114

7.6.1 Ejemplo 19: Transformación de un observable con [Observable.map] 114

7.6.2 Ejemplo 20: Filtrar un observable con [Observable.filter] 116

7.6.3 Ejemplo 21: Transformación de un observable con [Observable.flapMap] 117

7.6.4 Ejemplo 22: Otros métodos de la clase [Observable] 123

7.7 Programadores 127

7.7.1 Ejemplo 23: El programador [Schedulers.computation] 127

7.7.2 Ejemplo 24: El programador [Schedulers.io] 128

7.7.3 Ejemplo 25: El programador [Schedulers.newThread] 129

7.7.4 Ejemplo 26: Programadores [Schedulers.immediate, Schedulers.trampoline] 130

7.8 Conclusión 133

8 RxJava en el entorno Swing 134

8.1 Introducción 134

8.2 Estructura del código 135

8.3 Ejecución del proyecto 136

8.4 El servicio síncrono 136

8.5 El servicio asíncrono 139

8.6 La interfaz gráfica de usuario 141

8.7 Instanciación de la interfaz gráfica de usuario 143

8.8 Ejecución de solicitudes síncronas 144

8.9 Ejecución de solicitudes asíncronas 145

9 RxJava en el entorno Android 149

9.1 Introducción 149

9.2 El servicio web / JSON 149

9.2.1 El proyecto IntelliJ IDEA 150

9.2.2 Las dependencias Gradle del proyecto 151

9.2.3 La capa [de negocio] 153

9.2.4 El servicio web / JSON 156

9.2.5 Configuración del proyecto Spring 160

9.2.6 Ejecución del servidor web 161

9.3 El cliente Android 161

9.3.1 RxAndroid 161

9.3.2 El proyecto IntelliJ IDEA 162

9.3.3 Ejecución del proyecto IntelliJ IDEA 164

9.3.4 Las dependencias de Gradle del proyecto 166

9.3.5 El manifiesto de la aplicación Android 167

9.3.6 La capa [DAO] 168

9.3.6.1 La interfaz [IDao] de la capa [DAO] 168

9.3.6.2 Implementación de la capa [DAO] 170

9.3.7 Vistas de la aplicación 172

9.3.7.1 La clase [MyFragment] 174

9.3.7.2 El fragmento [RequestFragment] de la solicitud 176

9.3.7.3 El [ResponseFragment] de la respuesta 177

9.3.7.4 La [MainActivity] de Android 178

9.3.7.5 El fragmento [RequestFragment] 185

9.3.7.6 El fragmento [ResponseFragment] 187

9.3.8 Ejemplos de observables 190

9.3.8.1 Ejemplo-01 190

9.3.8.2 Ejemplo-02 193

9.3.8.3 Ejemplo-03 195

9.3.8.4 Ejemplo-04 197

9.3.8.5 Ejemplo-05 198

9.3.8.6 Continuar 202

9.3.9 Conclusión 202

10. Anexos 203

10.1 Instalación de un JDK 203

10.2 Instalación del Administrador del SDK de Android 203

10.3 Instalación del gestor del emulador Genymotion 204

10.4 Instalación del IDE IntelliJ IDEA Community Edition 205

10.5 Uso de los ejemplos 210

10.6 Trabajar con JSON en Java 211