10. Appendici
Di seguito illustriamo come installare gli strumenti utilizzati in questo documento su computer con sistema operativo da Windows 7 a Windows 10. Il lettore dovrà adattare la procedura al proprio ambiente.
10.1. Installazione di JDK
All'indirizzo URL è disponibile il [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (aprile 2016), mentre il JDK è la versione più recente. D'ora in poi chiameremo <jdk-install> la cartella di installazione del JDK.
![]() |
10.2. Installazione di SDK Android Manager
![]() |
- in [1], perché è necessario il SDK di Android;
Il SDK Manager di Android è disponibile all'indirizzo [https://developer.android.com/studio/index.html#downloads] (maggio 2016).
![]() |
Eseguire l'installazione di SDK Manager. Di seguito indicheremo la sua directory di installazione come <sdk-manager-install>. Avviare il programma.
Il progetto è stato configurato per (cfr. paragrafo 9.3.2):
- SDK API 23 [2];
- SDK Build-tools 23.0.3 [3];
- SDK Tool 25.1.3 [4]
Assicurarsi di aver scaricato questi elementi.
10.3. Installazione del gestore di emulatori Genymotion
Gli emulatori forniti con Android SDK sono lenti, il che ne scoraggia l'utilizzo. L'azienda [Genymotion] offre un emulatore performante. È disponibile su URL [https://cloud.genymotion.com/page/launchpad/download/] (maggio 2016).
Per ottenere una versione per uso personale è necessario registrarsi. Scaricate il prodotto [Genymotion] con la macchina virtuale VirtualBox:

D'ora in poi chiameremo <genymotion-install> la cartella di installazione di [Genymotion]. Avviate [Genymotion]. Scaricate quindi un'immagine per tablet:
![]() |
- in [1], aggiungere il terminale virtuale descritto in [2];
10.4. Installazione di IDE IntellijIDEA Community Edition
IDE [ Intellij IDEA Community Edition] è disponibile su URL [https://www.jetbrains.com/idea/#chooseYourEdition]:
![]() |
Installare il IDE e quindi avviarlo.
![]() | ![]() |
- in [1-2], configurare i plugin;
- in [3-4], aggiungere a IDE il plugin [Genymotion];
![]() |
- in [6-7], configurare IDE;
![]() | ![]() |
- in [8-9], specificare la cartella di installazione del gestore degli emulatori [Genymotion];
![]() |
- in [12-13], si configura il tipo predefinito dei progetti;
![]() | ![]() |
![]() |
- in [14-16], si configura il JDK;
![]() |
![]() | ![]() |
- in [17-20], si configura il SDK di Android;
![]() |
- in [21-22], si indica il JDK come impostazione predefinita per i progetti;
![]() | ![]() |
![]() |
- in [23-27], si disattiva il controllo ortografico che per impostazione predefinita è per la lingua inglese;
![]() | ![]() |
- in [28-32], scegliete il tipo di scorciatoie da tastiera che preferite. Potete mantenere quelle predefinite di IntelliJ oppure scegliere quelle di un altro IDE a cui siete più abituati;
![]() |
- in [33-35], configurate l’IDE per la gestione di più progetti. Può gestire diversi progetti nella stessa finestra o in finestre diverse;
![]() |
- in [36-37], impostare la numerazione delle righe come impostazione predefinita. Ciò consentirà di individuare rapidamente la riga che ha causato un'eccezione;
10.5. Utilizzo degli esempi
I progetti IntellijIDEA degli esempi sono disponibili |ICI|. Il paragrafo 1.3 spiega come aprirli.
10.6. Gestione del 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 oggetti in JSON ed esegue l'operazione inversa deserializzando le stringhe JSON prodotte per ricreare gli oggetti iniziali.
La libreria «Jackson» consente di costruire:
- la stringa JSON di un oggetto: new ObjectMapper().writeValueAsString(object);
- un oggetto a partire da una stringa JSON: new ObjectMapper().readValue(jsonString, Object.class).
Entrambi i metodi possono generare un IOException. Ecco un esempio.
![]() |
Il progetto sopra indicato è 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 [Personne] è la seguente:
package istia.st.json;
public class Personne {
// dati
private String nom;
private String prenom;
private int age;
// costruttori
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);
}
// getter e setter
...
}
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 {
// lo strumento di serializzazione/deserializzazione
static ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws IOException {
// creazione di una persona
Personne paul = new Personne("Denis", "Paul", 40);
// visualizzazione JSON
String json = mapper.writeValueAsString(paul);
System.out.println("Json=" + json);
// istanziazione di una persona a partire dal JSON
Personne p = mapper.readValue(json, Personne.class);
// visualizzazione di una persona
System.out.println("Personne=" + p);
// un array
Personne virginie = new Personne("Radot", "Virginie", 20);
Personne[] personnes = new Personne[]{paul, virginie};
// visualizzazione JSON
json = mapper.writeValueAsString(personnes);
System.out.println("Json personnes=" + json);
// dizionario
Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
hpersonnes.put("1", paul);
hpersonnes.put("2", virginie);
// visualizzazione JSON
json = mapper.writeValueAsString(hpersonnes);
System.out.println("Json hpersonnes=" + json);
}
}
L'esecuzione di questa classe produce la seguente visualizzazione sullo schermo:
Dall'esempio si ricava quanto segue:
- l'oggetto [ObjectMapper] necessario per le trasformazioni JSON / Oggetto: riga 11;
- la trasformazione [Personne] --> JSON: riga 17;
- la trasformazione JSON --> [Personne]: riga 20;
- l'eccezione [IOException] generata da entrambi i metodi: riga 13.
Indice
1 Introduzione 5
1.2Les Strumenti utilizzati 6
1.3Les codici degli esempi 6
2Un esempio introduttivo 9
2.1L: l'architettura dell'applicazione di esempio 9
2.2L'file eseguibile 9
2.3L'interfaccia sincrona 11
2.4L'chiamata sincrona 12
2.5Tests delle chiamate sincrone 13
2.6L «Interfaccia asincrona e relativa implementazione» 14
2.7L 'chiamata asincrona' 16
2.8Tests: le chiamate asincrone 19
2.8.1avec lo scheduler [Schedulers.io] 20
2.8.2avec lo scheduler [Schedulers.computation] 20
2.8.3avec pianificatore [Schedulers.newThread] 21
2.8.4avec gli scheduler [Schedulers.trampoline, Schedulers.immediate] 22
2.9Cas limiti 22
3Le firme delle classi e dei metodi generici 27
4Le funzioni lambda di Java 8 32
4.1Exemple-01 - Interfacce funzionali e lambda 32
4.2Exemple-02 - L'interfaccia funzionale Predicate<T> 34
4.3Exemple-03 - L'interfaccia funzionale Function<T,R> 37
4.4Exemple-04 - l'interfaccia funzionale Consumer<T> 38
4.5Exemple-05 - l'interfaccia funzionale BiConsumer<T,U> 40
4.6Exemple-06 - l'interfaccia funzionale BiFunction<T,U,R> 41
4.7Exemple-07 - l'interfaccia funzionale Supplier<T> 43
5Il tipo Stream<T> di Java 8 45
5.1Exemple-01 - la classe Stream 45
5.2Exemple-02 - elaborazione parallela degli elementi di uno Stream 47
5.3Exemple-03 - elaborazione parallela degli elementi di uno Stream 48
5.4Exemple-04 - Filtrare uno stream 50
5.5Exemple-05 - Creazione di uno Stream<T2> a partire da uno Stream<T1> 52
5.6Exemple-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[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 Metodi di flusso dei numeri primitivi 71
6 Le interfacce funzionali della libreria RxJava 72
6.1Exemple-01: l'interfaccia funzionale [Action0] 72
6.2Exemple-02, 03: l'interfaccia funzionale [Actioni] 73
6.3Exemple-04, 05: l'interfaccia funzionale [Funci] 74
7La libreria RxJava 77
7.1 Creazione e sottoscrizione di osservabili 77
7.1.1Exemple-01: il metodo [Observable.from] 77
7.1.2Exemple-03: la classe Observer 82
7.1.3Exemple-04: il metodo [Observable.create] 84
7.1.4Exemple-05: rifattorizzazione di [Exemple-04] 86
7.2Thread: esecuzione, thread di osservazione 88
7.2.1Exemple-06: osservabile e osservatore in un thread diverso da [main] 88
7.2.2Exemple-07: osservabile e osservatore in due thread diversi 90
7.3Observables predefiniti 92
7.3.1Exemple-08: il metodo [Observable.range] 92
7.3.2Exemple-09: i metodi Observable.[interval, take, doNext] 96
7.3.3Exemples-10/12: i metodi Observable.[error, empty, never] 98
7.4.1Exemple-13: thread di azione, thread di osservazione 103
7.5Combinaisons di più osservabili 106
7.5.1Exemple-14: unire due osservabili con [Observable.merge] 106
7.5.2Exemple-15: concatenare due osservabili con [Observable.concat] 108
7.5.3Exemple-16: combinare due osservabili con [Observable.zip] 109
7.5.4Exemple-17: combinare due osservabili con [Observable.combineLatest] 111
7.5.5Exemple-18: combinare due osservabili con [Observable.amb] 113
7.6 Catena di elaborazione di un osservabile 114
7.6.1Exemple-19: trasformare un osservabile con [Observable.map] 114
7.6.2Exemple-20: filtrare un osservabile con [Observable.filter] 116
7.6.3Exemple-21: trasformare un osservabile con [Observable.flapMap] 117
7.6.4Exemples-22: altri metodi della classe [Observable] 123
7.7Les: scheduler 127
7.7.1Exemple-23: lo scheduler [Schedulers.computation] 127
7.7.2Exemple-24: lo scheduler [Schedulers.io] 128
7.7.3Exemple-25: lo scheduler [Schedulers.newThread] 129
7.7.4Exemple-26: gli scheduler [Schedulers.immediate, Schedulers.trampoline] 130
7.8Conclusion 133
8RxJava nell'ambiente Swing 134
8.1Introduction 134
8.2La struttura del codice 135
8.3 Esecuzione del progetto 136
8.4Le servizio sincrono 136
8.5Le servizio asincrono 139
8.6L «interfaccia grafica» 141
8.7Instanciation dell'interfaccia grafica 143
8.8 Esecuzione delle query sincrone 144
8.9 Esecuzione delle richieste asincrone 145
9 RxJava nell'ambiente Android 149
9.1Introduction 149
9.2Le servizio web / jSON 149
9.2.1Le progetto IntelliJ IDEA 150
9.2.2Les Dipendenze Gradle del progetto 151
9.2.3La livello [métier] 153
9.2.4Le servizio web / JSON 156
9.2.5Configuration del progetto Spring 160
9.2.6 Esecuzione del server web 161
9.3Le client Android 161
9.3.1RxAndroid 161
9.3.2Le progetto IntelliJ IDEA 162
9.3.3 Esecuzione del progetto IntelliJ IDEA 164
9.3.4Les Dipendenze Gradle del progetto 166
9.3.5Le manifesto dell'applicazione Android 167
9.3.6La livello [DAO] 168
9.3.6.1L: interfaccia [IDao] del livello [DAO] 168
9.3.6.2 Implementazione del livello [DAO] 170
9.3.7Les: viste dell'applicazione 172
9.3.7.1La classe [MyFragment] 174
9.3.7.2Le frammento [RequestFragment] della richiesta 176
9.3.7.3Le frammento [ResponseFragment] della risposta 177
9.3.7.4L'attività Android [MainActivity] 178
9.3.7.5Le frammento [RequestFragment] 185
9.3.7.6Le frammento [ResponseFragment] 187
9.3.8Les esempi di osservabili 190
9.3.8.6Pour continua 202
9.3.9Conclusion 202
10Allegati 203
10.1Installation da un JDK 203
10.2Installation da SDK Manager di Android 203
10.3Installation dal gestore di emulatori Genymotion 204
10.4Installation da IDE IntellijIDEA Community Edition 205
10.5Utilisation degli esempi 210
10.6Gestion da jSON in Java 211

























