Skip to content

10. Appendici

Qui spieghiamo come installare gli strumenti utilizzati in questo documento su macchine con Windows 7-10. I lettori dovrebbero adattare queste istruzioni al proprio ambiente.

10.1. Installazione di un JDK

L'ultimo JDK è disponibile all'URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (aprile 2016). D'ora in poi ci riferiremo alla cartella di installazione del JDK come <jdk-install>.

 

10.2. Installazione di Android SDK Manager

 
  • Vedi [1] per capire perché abbiamo bisogno dell'SDK di Android;

L'Android SDK Manager è disponibile all'indirizzo [https://developer.android.com/studio/index.html#downloads] (maggio 2016).

 

Installare SDK Manager. Ci riferiremo alla sua directory di installazione come <sdk-manager-install> ( ). Avviarlo.

Il progetto è stato configurato per (vedere la sezione 9.3.2):

  • SDK API 23 [2];
  • Strumenti di compilazione SDK 23.0.3 [3];
  • SDK Tool 25.1.3 [4]

Assicurati di aver scaricato questi componenti.

10.3. Installazione di Genymotion Emulator Manager

Gli emulatori forniti con l'SDK Android sono lenti, il che ne scoraggia l'uso. L'azienda [Genymotion] offre un emulatore ad alte prestazioni. È disponibile all'URL [https://cloud.genymotion.com/page/launchpad/download/] (maggio 2016).

Dovrai registrarti per ottenere una versione per uso personale. Scarica il prodotto [Genymotion] con la macchina virtuale VirtualBox:

Image

D'ora in poi ci riferiremo alla cartella di installazione di [Genymotion] come <genymotion-install>. Avviare [Genymotion]. Quindi scaricare un'immagine per un tablet:

 
  • in [1], aggiungere il terminale virtuale descritto in [2];

10.4. Installazione dell'IDE IntelliJ IDEA Community Edition

L'IDE [IntelliJ IDEA Community Edition] è disponibile all'indirizzo [https://www.jetbrains.com/idea/#chooseYourEdition]:

 

Installa l'IDE e poi avvialo.

  • In [1-2], configurare i plugin;
  • In [3-4], aggiungere il plugin [Genymotion] all'IDE;
 
  • In [6-7], configurare l'IDE;
  • In [8-9], specificare la cartella di installazione per il gestore dell'emulatore [Genymotion];
  • In [12-13], configurare il tipo di progetto predefinito;
 
  • nei paragrafi [14-16], configurare il JDK;
 
  • In [17-20], configurare l'SDK Android;
 
  • In [21-22], specificare il JDK predefinito per i progetti;
 
  • In [23-27], disattiva il controllo ortografico, che per impostazione predefinita è impostato sull'inglese;
  • In [28-32], scegli il tipo di scorciatoie da tastiera che desideri. Puoi mantenere le impostazioni predefinite di IntelliJ oppure scegliere quelle di un altro IDE a cui sei più abituato;
 
  • Nei paragrafi [33-35], configurare l'IDE per la gestione di più progetti. È possibile gestire diversi progetti nella stessa finestra o in finestre diverse;
 
  • In [36-37], abilitare la numerazione delle righe per impostazione predefinita. Ciò consentirà di individuare rapidamente la riga che ha causato un'eccezione;

10.5. Utilizzo degli esempi

I progetti IntelliJ IDEA relativi agli esempi sono disponibili |QUI|. La sezione 1.3 spiega come aprirli.

10.6. Gestione di JSON in Java

In modo trasparente per lo sviluppatore, il framework [Spring MVC] utilizza la libreria JSON [Jackson]. Per illustrare cos'è il JSON (JavaScript Object Notation), presentiamo qui un programma che serializza gli oggetti in JSON ed esegue l'operazione inversa deserializzando le stringhe JSON generate per ricreare gli oggetti originali.

La libreria 'Jackson' consente di costruire:

  • la stringa JSON di un oggetto: new ObjectMapper().writeValueAsString(object);
  • un oggetto da una stringa JSON: new ObjectMapper().readValue(jsonString, Object.class).

Entrambi i metodi possono generare un'eccezione IOException. Ecco un esempio.

  

Il progetto sopra riportato è un progetto Maven con il seguente file [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>
  • righe 12–16: la dipendenza che include la libreria 'Jackson';

La classe [Person] è la seguente:


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 classe [Main] è la seguente:


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);
  }
}

L'esecuzione di questa classe produce il seguente output sullo schermo:

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}}

Punti chiave dell'esempio:

  • l'oggetto [ObjectMapper] necessario per le trasformazioni JSON/Object: riga 11;
  • la trasformazione [Person] --> JSON: riga 17;
  • la trasformazione da JSON a [Person]: riga 20;
  • l'eccezione [IOException] generata da entrambi i metodi: riga 13.

Indice

1 Introduzione 5

1.1 Contesto 5

1.2 Strumenti utilizzati 6

1.3 Codici di esempio 6

2 Un esempio di introduzione 9

2.1 L'architettura dell'applicazione di esempio 9

2.2 L'eseguibile 9

2.3 L'interfaccia sincrona 11

2.4 La chiamata sincrona 12

2.5 Test delle chiamate sincrone 13

2.6 L'interfaccia asincrona e la sua implementazione 14

2.7 La chiamata asincrona 16

2.8 Test delle chiamate asincrone 19

2.8.1 con lo scheduler [Schedulers.io] 20

2.8.2 con lo scheduler [Schedulers.computation] 20

2.8.3 con lo scheduler [Schedulers.newThread] 21

2.8.4 con gli scheduler [Schedulers.trampoline, Schedulers.immediate] 22

2.9 Casi limite 22

2.10 Conclusione 24

3Firme di classi e metodi generici 27

4Espressioni lambda in Java 8 32

4.1 Esempio-01 - Interfacce funzionali e lambda 32

4.2 Esempio-02 - L'interfaccia funzionale Predicate<T> 34

4.3 Esempio-03 - L'interfaccia funzionale Function<T,R> 37

4.4 Esempio-04 - L'interfaccia funzionale Consumer<T> 38

4.5 Esempio-05 - L'interfaccia funzionale BiConsumer<T,U> 40

4.6 Esempio-06 - L'interfaccia funzionale BiFunction<T,U,R> 41

4.7 Esempio-07 - L'interfaccia funzionale Supplier<T> 43

5 Il tipo Stream<T> in Java 8 45

5.1 Esempio-01 - La classe Stream 45

5.2 Esempio 02 - Elaborazione parallela degli elementi dello Stream 47

5.3 Esempio 3 - Elaborazione parallela degli elementi dello stream 48

5.4 Esempio 04 - Filtraggio di uno stream 50

5.5 Esempio 05 - Creazione di uno Stream<T2> da uno Stream<T1> 52

5.6 Esempio-06 - Altri metodi della classe 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[conteggio] 59

5.6.6[max, min] 60

5.6.7[ridurre] 63

5.6.8[ordinato] 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 Metodi primitivi per i flussi di numeri 71

6Interfacce funzionali nella libreria RxJava 72

6.1 Esempio-01: L'interfaccia funzionale [Action0] 72

6.2 Esempi 02 e 03: L'interfaccia funzionale [Actioni] 73

6.3 Esempi 04 e 05: L'interfaccia funzionale [Funci] 74

7 La libreria RxJava 77

7.1 Creazione e sottoscrizione agli Observable 77

7.1.1 Esempio-01: Il metodo [Observable.from] 77

7.1.2 Esempio-03: La classe Observer 82

7.1.3 Esempio-04: il metodo [Observable.create] 84

7.1.4 Esempio-05: Rifattorizzazione dell'[Esempio-04] 86

7.2 Thread di esecuzione, thread di osservazione 88

7.2.1 Esempio-06: Osservabile e Osservatore in un thread diverso da [main] 88

7.2.2 Esempio-07: Observable e observer in due thread diversi 90

7.3 Observable predefiniti 92

7.3.1 Esempio-08: Il metodo [Observable.range] 92

7.3.2 Esempio-09: I metodi Observable.[interval, take, doNext] 96

7.3.3 Esempi-10/12: i metodi Observable.[error, empty, never] 98

7.4 Multithreading 102

7.4.1 Esempio 13: thread di azione, thread di osservazione 103

7.5 Combinazioni di più osservabili 106

7.5.1 Esempio 14: Unione di due osservabili con [Observable.merge] 106

7.5.2 Esempio 15: Concatenazione di due osservabili con [Observable.concat] 108

7.5.3 Esempio 16: Combinazione di due osservabili utilizzando [Observable.zip] 109

7.5.4 Esempio 17: Combinazione di due osservabili con [Observable.combineLatest] 111

7.5.5 Esempio 18: Combinazione di due osservabili con [Observable.amb] 113

7.6 Catena di elaborazione per un osservabile 114

7.6.1 Esempio 19: Trasformazione di un osservabile con [Observable.map] 114

7.6.2 Esempio 20: Filtrare un osservabile con [Observable.filter] 116

7.6.3 Esempio 21: Trasformazione di un osservabile con [Observable.flapMap] 117

7.6.4 Esempio 22: Altri metodi della classe [Observable] 123

7.7 Scheduler 127

7.7.1 Esempio 23: Lo scheduler [Schedulers.computation] 127

7.7.2 Esempio 24: Lo scheduler [Schedulers.io] 128

7.7.3 Esempio 25: Lo scheduler [Schedulers.newThread] 129

7.7.4 Esempio 26: Scheduler [Schedulers.immediate, Schedulers.trampoline] 130

7.8 Conclusione 133

8 RxJava nell'ambiente Swing 134

8.1 Introduzione 134

8.2 Struttura del codice 135

8.3 Esecuzione del progetto 136

8.4 Il servizio sincrono 136

8.5 Il servizio asincrono 139

8.6 L'interfaccia grafica utente 141

8.7 Istanziamento dell'interfaccia grafica utente 143

8.8 Esecuzione delle richieste sincrone 144

8.9 Esecuzione delle richieste asincrone 145

9 RxJava nell'ambiente Android 149

9.1 Introduzione 149

9.2 Il servizio web / JSON 149

9.2.1 Il progetto IntelliJ IDEA 150

9.2.2 Dipendenze Gradle del progetto 151

9.2.3 Il livello [aziendale] 153

9.2.4 Il servizio Web / JSON 156

9.2.5 Configurazione del progetto Spring 160

9.2.6 Esecuzione del server Web 161

9.3 Il client Android 161

9.3.1 RxAndroid 161

9.3.2 Il progetto IntelliJ IDEA 162

9.3.3 Esecuzione del progetto IntelliJ IDEA 164

9.3.4 Dipendenze Gradle del progetto 166

9.3.5 Il manifesto dell'applicazione Android 167

9.3.6 Il livello [DAO] 168

9.3.6.1 L'interfaccia [IDao] del livello [DAO] 168

9.3.6.2 Implementazione del livello [DAO] 170

9.3.7 Viste dell'applicazione 172

9.3.7.1 La classe [MyFragment] 174

9.3.7.2 Il frammento [RequestFragment] della richiesta 176

9.3.7.3 Il [ResponseFragment] della risposta 177

9.3.7.4 La [MainActivity] di Android 178

9.3.7.5 Il frammento [RequestFragment] 185

9.3.7.6 Il frammento [ResponseFragment] 187

9.3.8 Esempi di osservabili 190

9.3.8.1 Esempio-01 190

9.3.8.2 Esempio-02 193

9.3.8.3 Esempio-03 195

9.3.8.4 Esempio-04 197

9.3.8.5 Esempio-05 198

9.3.8.6 Per continuare 202

9.3.9 Conclusione 202

10Appendici 203

10.1 Installazione di un JDK 203

10.2 Installazione di Android SDK Manager 203

10.3 Installazione di Genymotion Emulator Manager 204

10.4 Installazione dell'IDE IntelliJ IDEA Community Edition 205

10.5 Utilizzo degli esempi 210

10.6 Lavorare con JSON in Java 211