10. Anhänge
Hier erklären wir, wie die in diesem Dokument verwendeten Tools auf Windows-7- bis Windows-10-Rechnern installiert werden. Leser sollten diese Anweisungen an ihre eigene Umgebung anpassen.
10.1. Installation eines JDK
Das neueste JDK finden Sie unter der URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (Stand: April 2016). Wir bezeichnen den JDK-Installationsordner im Folgenden als <jdk-install>.
![]() |
10.2. Installation des Android SDK Managers
![]() |
- Warum wir das Android SDK benötigen, erfahren Sie unter [1];
Den Android SDK Manager finden Sie unter [https://developer.android.com/studio/index.html#downloads] (Stand: Mai 2016).
![]() |
Installieren Sie den SDK Manager. Wir bezeichnen sein Installationsverzeichnis als <sdk-manager-install> ( ). Starten Sie das Programm.
Das Projekt wurde für folgende Version konfiguriert (siehe Abschnitt 9.3.2):
- SDK API 23 [2];
- SDK-Build-Tools 23.0.3 [3];
- das SDK-Tool 25.1.3 [4]
Stellen Sie sicher, dass Sie diese Komponenten heruntergeladen haben.
10.3. Installation des Genymotion Emulator Managers
Die im Android SDK enthaltenen Emulatoren sind langsam, was von ihrer Verwendung abhält. Das Unternehmen [Genymotion] bietet einen leistungsstarken Emulator an. Dieser ist unter der URL [https://cloud.genymotion.com/page/launchpad/download/] (Mai 2016) verfügbar.
Sie müssen sich registrieren, um eine Version für den privaten Gebrauch zu erhalten. Laden Sie das [Genymotion]-Produkt mit der VirtualBox-Virtualisierungssoftware herunter:

Wir bezeichnen den [Genymotion]-Installationsordner von nun an als <genymotion-install>. Starten Sie [Genymotion]. Laden Sie anschließend ein Image für ein Tablet herunter:
![]() |
- in [1] das in [2] beschriebene virtuelle Terminal hinzufügen;
10.4. Installation der IntelliJ IDEA Community Edition IDE
Die [IntelliJ IDEA Community Edition] IDE ist unter [https://www.jetbrains.com/idea/#chooseYourEdition] verfügbar:
![]() |
Installieren Sie die IDE und starten Sie sie anschließend.
![]() | ![]() |
- Konfigurieren Sie in [1-2] die Plugins;
- Fügen Sie in [3-4] das [Genymotion]-Plugin zur IDE hinzu;
![]() |
- Konfigurieren Sie in [6-7] die IDE;
![]() | ![]() |
- Geben Sie in [8-9] den Installationsordner für den [Genymotion]-Emulator-Manager an;
![]() |
- Konfigurieren Sie in [12-13] den Standardprojekttyp;
![]() | ![]() |
![]() |
- in [14-16] das JDK konfigurieren;
![]() |
![]() | ![]() |
- Konfigurieren Sie in [17-20] das Android SDK;
![]() |
- Geben Sie in [21-22] das Standard-JDK für Projekte an;
![]() | ![]() |
![]() |
- Deaktivieren Sie in [23-27] die Rechtschreibprüfung, die standardmäßig auf Englisch eingestellt ist;
![]() | ![]() |
- Wählen Sie in [28-32] die gewünschten Tastenkombinationen aus. Sie können die Standardeinstellungen von IntelliJ beibehalten oder solche aus einer anderen IDE wählen, an die Sie eher gewöhnt sind;
![]() |
- Konfigurieren Sie in [33-35] die IDE für mehrere Projekte. Sie kann mehrere Projekte im selben Fenster oder in verschiedenen Fenstern verwalten;
![]() |
- Aktivieren Sie in [36-37] standardmäßig die Zeilennummerierung. So können Sie schnell die Zeile finden, die eine Ausnahme ausgelöst hat;
10.5. Verwendung der Beispiele
Die IntelliJ IDEA-Projekte für die Beispiele sind |HIER| verfügbar. In Abschnitt 1.3 wird erklärt, wie Sie diese öffnen können.
10.6. Verwaltung von JSON in Java
Für den Entwickler transparent nutzt das [Spring MVC]-Framework die [Jackson]-JSON-Bibliothek. Um zu veranschaulichen, was JSON (JavaScript Object Notation) ist, stellen wir hier ein Programm vor, das Objekte in JSON serialisiert und den umgekehrten Vorgang durchführt, indem es die generierten JSON-Strings deserialisiert, um die ursprünglichen Objekte wiederherzustellen.
Mit der „Jackson“-Bibliothek können Sie
- die JSON-Zeichenkette eines Objekts: new ObjectMapper().writeValueAsString(object);
- ein Objekt aus einer JSON-Zeichenkette: new ObjectMapper().readValue(jsonString, Object.class).
Beide Methoden können eine IOException auslösen. Hier ist ein Beispiel.
![]() |
Das oben genannte Projekt ist ein Maven-Projekt mit der folgenden [pom.xml]-Datei;
<?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>
- Zeilen 12–16: die Abhängigkeit, die die Bibliothek „Jackson“ enthält;
Die Klasse [Person] sieht wie folgt aus:
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
...
}
Die Klasse [Main] sieht wie folgt aus:
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);
}
}
Die Ausführung dieser Klasse erzeugt folgende Bildschirmausgabe:
Wichtige Erkenntnisse aus dem Beispiel:
- das für JSON/Objekt-Transformationen erforderliche [ObjectMapper]-Objekt: Zeile 11;
- die [Person] --> JSON-Transformation: Zeile 17;
- die JSON --> [Person]-Transformation: Zeile 20;
- die von beiden Methoden ausgelöste [IOException]: Zeile 13.
Inhaltsverzeichnis
1Einleitung 5
1.1Hintergrund 5
1.2 Verwendete Werkzeuge 6
1.3 Die Beispielcodes 6
2Ein Beispiel für eine Einleitung 9
2.1 Die Architektur der Beispielanwendung 9
2.2 Die ausführbare Datei 9
2.3 Die synchrone Schnittstelle 11
2.4 Der synchrone Aufruf 12
2.5 Testen synchroner Aufrufe 13
2.6 Die asynchrone Schnittstelle und ihre Implementierung 14
2.7 Der asynchrone Aufruf 16
2.8 Testen asynchroner Aufrufe 19
2.8.1 mit dem Scheduler [Schedulers.io] 20
2.8.2 mit dem Scheduler [Schedulers.computation] 20
2.8.3 mit dem Scheduler [Schedulers.newThread] 21
2.8.4 mit den Schedulern [Schedulers.trampoline, Schedulers.immediate] 22
2.9 Randfälle 22
2.10 Schlussfolgerung 24
3Signaturen generischer Klassen und Methoden 27
4Java 8-Lambda-Ausdrücke 32
4.1Beispiel-01 – Funktionale Schnittstellen und Lambdas 32
4.2Beispiel-02 – Die funktionale Schnittstelle Predicate<T> 34
4.3 Beispiel-03 – Die funktionale Schnittstelle Function<T,R> 37
4.4 Beispiel 04 – Die funktionale Schnittstelle Consumer<T> 38
4.5 Beispiel 05 – Die funktionale Schnittstelle BiConsumer<T,U> 40
4.6 Beispiel 06 – Die funktionale Schnittstelle BiFunction<T,U,R> 41
4.7 Beispiel 07 – Die funktionale Schnittstelle Supplier<T> 43
5Der Typ Stream<T> in Java 8 45
5.1Beispiel-01 – Die Stream-Klasse 45
5.2Beispiel-02 – Parallele Verarbeitung von Stream-Elementen 47
5.3 Beispiel 3 – Parallele Verarbeitung von Stream-Elementen 48
5.4 Beispiel 04 – Filtern eines Streams 50
5.5 Beispiel 05 – Erstellen eines Stream<T2> aus einem Stream<T1> 52
5.6Beispiel-06 – Weitere Methoden der Klasse 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[Anzahl] 59
5.6.6[max, min] 60
5.6.7[reduce] 63
5.6.8[sortiert] 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 Primitive Methoden für Zahlenströme 71
6Funktionale Schnittstellen in der RxJava-Bibliothek 72
6.1 Beispiel 01: Die funktionale Schnittstelle [Action0] 72
6.2 Beispiele 02 und 03: Die funktionale Schnittstelle [Actioni] 73
6.3 Beispiel 04, 05: Die funktionale Schnittstelle [Funci] 74
7Die RxJava-Bibliothek 77
7.1 Erstellen und Abonnieren von Observables 77
7.1.1Beispiel-01: Die Methode [Observable.from] 77
7.1.2 Beispiel 03: Die Observer-Klasse 82
7.1.3Beispiel-04: Die Methode [Observable.create] 84
7.1.4Beispiel-05: Refactoring von [Beispiel-04] 86
7.2 Ausführungsthread, Beobachtungsthread 88
7.2.1Beispiel-06: Observable und Observer in einem anderen Thread als [main] 88
7.2.2 Beispiel 07: Observable und Observer in zwei verschiedenen Threads 90
7.3 Vordefinierte Observables 92
7.3.1Beispiel-08: Die Methode [Observable.range] 92
7.3.2 Beispiel 09: Die Methoden [Observable.range], [take] und [doNext] 96
7.3.3Beispiele 10/12: Die Methoden Observable.[error, empty, never] 98
7.4 Multithreading 102
7.4.1 Beispiel 13: Aktionsstrang, Beobachtungsstrang 103
7.5 Kombinationen mehrerer Beobachtungsgrößen 106
7.5.1Beispiel 14: Zusammenführen zweier Observables mit [Observable.merge] 106
7.5.2 Beispiel 15: Verkettung zweier Observables mit [Observable.concat] 108
7.5.3 Beispiel 16: Kombinieren zweier Observables mit [Observable.zip] 109
7.5.4 Beispiel 17: Kombinieren zweier Observables mit [Observable.combineLatest] 111
7.5.5 Beispiel 18: Kombinieren von zwei Observables mit [Observable.amb] 113
7.6 Verarbeitungskette für ein Observable 114
7.6.1Beispiel 19: Transformieren eines Observables mit [Observable.map] 114
7.6.2 Beispiel 20: Filtern eines Observables mit [Observable.filter] 116
7.6.3Beispiel 21: Transformieren eines Observables mit [Observable.flapMap] 117
7.6.4Beispiel 22: Weitere Methoden der Klasse [Observable] 123
7.7 Scheduler 127
7.7.1 Beispiel 23: Der Scheduler [Schedulers.computation] 127
7.7.2 Beispiel 24: Der Scheduler [Schedulers.io] 128
7.7.3 Beispiel 25: Der Scheduler [Schedulers.newThread] 129
7.7.4 Beispiel 26: Scheduler [Schedulers.immediate, Schedulers.trampoline] 130
7.8 Schlussfolgerung 133
8RxJava in der Swing-Umgebung 134
8.1 Einleitung 134
8.2 Codestruktur 135
8.3 Projektdurchführung 136
8.4 Der synchrone Dienst 136
8.5 Der asynchrone Dienst 139
8.6 Die grafische Benutzeroberfläche 141
8.7 Instanziierung der grafischen Benutzeroberfläche 143
8.8 Ausführen synchroner Anfragen 144
8.9 Ausführen asynchroner Anfragen 145
9 RxJava in der Android-Umgebung 149
9.1 Einleitung 149
9.2 Der Webdienst / JSON 149
9.2.1 Das IntelliJ IDEA-Projekt 150
9.2.2 Die Gradle-Abhängigkeiten des Projekts 151
9.2.3 Die [Geschäfts-]Schicht 153
9.2.4 Der Webdienst / JSON 156
9.2.5 Spring-Projektkonfiguration 160
9.2.6 Ausführen des Webservers 161
9.3 Der Android-Client 161
9.3.1 RxAndroid 161
9.3.2 Das IntelliJ IDEA-Projekt 162
9.3.3 Ausführen des IntelliJ IDEA-Projekts 164
9.3.4 Die Gradle-Abhängigkeiten des Projekts 166
9.3.5 Das Android-Anwendungsmanifest 167
9.3.6 Die [DAO]-Schicht 168
9.3.6.1 Die [IDao]-Schnittstelle der [DAO]-Schicht 168
9.3.6.2Implementierung der [DAO]-Schicht 170
9.3.7 Anwendungsansichten 172
9.3.7.1 Die [MyFragment]-Klasse 174
9.3.7.2 Das [RequestFragment]-Fragment der Anfrage 176
9.3.7.3 Das [ResponseFragment] der Antwort 177
9.3.7.4 Die Android-Klasse [MainActivity] 178
9.3.7.5 Das [RequestFragment]-Fragment 185
9.3.7.6 Das Fragment [ResponseFragment] 187
9.3.8 Beispiele für Observables 190
9.3.8.1 Beispiel-01 190
9.3.8.2 Beispiel 02 193
9.3.8.3Beispiel-03 195
9.3.8.4 Beispiel 04 197
9.3.8.5Beispiel-05 198
9.3.8.6Weiter 202
9.3.9 Schlussfolgerung 202
10Anhänge 203
10.1 Installation eines JDK 203
10.2 Installation des Android SDK Managers 203
10.3 Installation des Genymotion Emulator Managers 204
10.4 Installation der IntelliJ IDEA Community Edition IDE 205
10.5 Verwendung der Beispiele 210
10.6 Arbeiten mit JSON in Java 211

























