Funktionale Programmierung in Java
Mit der Version 8 erhielt die objektorientierte Programmiersprache Java die Möglichkeit, mit ihr funktional zu programmieren. Dieser Programmierstil hat seitdem bei Java-Entwicklern immer mehr an Popularität gewonnen, getrieben durch den Trend zu datenzentrierten Anwendungen und neueren Programmiers...
Otros Autores: | |
---|---|
Formato: | Libro electrónico |
Idioma: | Inglés |
Publicado: |
dpunkt
2020.
|
Edición: | 1st edition |
Materias: | |
Ver en Biblioteca Universitat Ramon Llull: | https://discovery.url.edu/permalink/34CSUC_URL/1im36ta/alma991009631053206719 |
Tabla de Contenidos:
- Intro
- Inhaltsverzeichnis
- Vorwort
- 1 Einleitung
- 1.1 Elementare Konzepte und Begriffe
- 1.2 Funktionale Programmierung in Java
- 2 Sprachliche Grundlagen
- 2.1 Java Generics
- 2.1.1 Typparameter
- 2.1.2 Typconstraints
- 2.1.3 Ko- und Kontravarianz
- 2.1.4 Typinferenz bei Generics
- 2.1.5 Schwachstellen der Generics in Java
- 2.2 Default-Methoden
- 2.3 Lambda-Ausdrücke
- 2.3.1 Formen von Lambda-Ausdrücken
- 2.3.2 Typ eines Lambda-Ausdrucks
- 2.3.3 Ausnahmen bei Lambda-Ausdrücken
- 2.3.4 Closures
- 2.4 Funktionale Interfaces
- 2.5 Methodenreferenzen
- 2.6 Zusammenfassung
- 3 Programmieren ohne Seiteneffekte
- 3.1 Reine Funktionen
- 3.1.1 Iteration vs. Rekursion
- 3.1.2 Referentielle Transparenz und Ersetzungsprinzip
- 3.1.3 Funktionen mit Gedächtnis
- 3.2 Funktionale Ausnahmebehandlung mit Optional
- 3.3 Funktionale Listen
- 3.3.1 Beispielanwendung
- 3.4 Paare und Tupel
- 3.5 Zusammenfassung
- 4 Programmieren mit Funktionsparametern
- 4.1 Listenverarbeitung mit Funktionen höherer Ordnung
- 4.2 Flexible Programmschnittstellen
- 4.3 Algorithmen
- 4.3.1 Tiefensuche
- 4.3.2 Verallgemeinerung der Suche
- 4.4 Entwurfsmuster
- 4.4.1 Strategie
- 4.4.2 Kommando
- 4.4.3 Besucher
- 4.5 Eingebettete und bedingte Ausführung
- 4.5.1 Eingebetteter Code
- 4.5.2 Bedingte Ausführung
- 4.5.3 Fallunterscheidungen
- 4.5.4 Typtests
- 4.6 Auswertung nach Bedarf
- 4.6.1 Faule Iteratoren
- 4.6.2 Unendliche Folgen
- 4.6.3 Faule Iteration über die Knoten eines Graphen
- 4.7 Zusammenfassung
- 5 Kombination von Funktionen
- 5.1 Flüssige Schnittstellen
- 5.2 Funktionskomposition
- 5.2.1 Aufrufketten beim funktionalen Interface Function
- 5.2.2 Logische Verknüpfungen bei Predicate
- 5.2.3 Bilden von Vergleichsketten mit Comparator
- 5.2.4 Beispiel-Workflows
- 5.3 Kombinator-Parser.
- 5.3.1 Parser und Parser-Ergebnisse
- 5.3.2 Kombinationsoperatoren
- 5.3.3 Parser für Boolesche Ausdrücke
- 5.4 Domänen-spezifische Sprachen
- 5.4.1 Fallbeispiel Zustandsmaschinen
- 5.5 Zusammenfassung
- 6 Funktoren, Monoide und Monaden
- 6.1 Funktoren
- 6.1.1 Funktor Optional
- 6.1.2 Gesetze und Eigenschaften
- 6.2 Monoide und Reduktion
- 6.2.1 Monoide
- 6.2.2 Reduktion
- 6.2.3 Monoide in Java
- 6.2.4 Reduzierbare Strukturen
- 6.2.5 Anwendungsbeispiele zur Reduktion mit Monoiden
- 6.3 Monaden
- 6.3.1 Monade Optional
- 6.3.2 Monade Parser
- 6.3.3 Gesetze
- 6.3.4 Bedeutung von Monaden
- 6.3.5 MonadPlus: Monade mit monoider Kombination
- 6.4 Zusammenfassung
- 7 Streams
- 7.1 Grundlagen von Streams
- 7.1.1 Ein erstes Beispiel
- 7.1.2 Externe vs. interne Iteration
- 7.1.3 Bedarfsauswertung
- 7.2 Klassen von Streams
- 7.3 Stream-Operationen
- 7.3.1 Erzeuger-Operationen
- 7.3.2 Zwischenoperationen
- 7.3.3 Terminal-Operationen
- 7.4 Collectors
- 7.4.1 Interface Collector
- 7.4.2 Vordefinierte Collectors
- 7.4.3 Downstream Collectors
- 7.4.4 Eine eigene Collector-Implementierung
- 7.5 Anwendungsbeispiele
- 7.5.1 Ergebnisauswertung mit Streams
- 7.5.2 Wortindex zu einem Text
- 7.6 Hinweise
- 7.6.1 Einmal-Iteration
- 7.6.2 Begrenzung von unendlichen Streams
- 7.6.3 Zustandslose und zustandsbehaftete Operationen
- 7.6.4 Reihenfolge von Operationen
- 7.6.5 Kombinationen von Operationen
- 7.7 Interne Implementierung
- 7.7.1 Beispiel
- 7.8 Zusammenfassung
- 8 Parallele Streams
- 8.1 Erzeugen von parallelen Streams
- 8.2 Parallele Ausführung
- 8.2.1 Spliterators
- 8.2.2 Ausführung durch Fork/Join-Pool
- 8.2.3 Konfiguration des Fork/Join-Thread-Pools
- 8.3 Bedingungen bei paralleler Ausführung
- 8.3.1 Parallele Ausführung und Seiteneffekte
- 8.3.2 Parallele Ausführung und zustandsbehaftete Berechnungen.
- 8.3.3 Eigenschaften der Parameter von reduce
- 8.3.4 Paralleles Sammeln
- 8.4 Laufzeit
- 8.5 Zusammenfassung
- 9 Asynchrone Funktionsketten
- 9.1 Eine Lösung mit parallelen Streams
- 9.2 Asynchrone Lösung mit Futures
- 9.3 CompletableFuture
- 9.4 Asynchrone Programmschnittstellen
- 9.5 CompletableFuture als Promise
- 9.6 Kombination von CompletableFutures
- 9.6.1 Beispiel
- 9.7 Zusammenfassung
- 10 Reaktive Streams
- 10.1 Grundlagen
- 10.1.1 Kontrakt von Observable
- 10.1.2 Erzeugen von Observables
- 10.1.3 Anmelden und Abmelden von Observer
- 10.2 Varianten
- 10.2.1 Single
- 10.2.2 Completable
- 10.2.3 Maybe
- 10.3 Hot und Cold Observables
- 10.3.1 ConnectableObservable
- 10.3.2 Beispiel Echtzeitdaten
- 10.4 Operationen
- 10.4.1 Abbildungen
- 10.4.2 Filtern und Teilmengen
- 10.4.3 Reduktion
- 10.4.4 Sammeln
- 10.4.5 Operationen mit Zeit
- 10.4.6 Kombinationen
- 10.4.7 Konvertierungen
- 10.4.8 Seiteneffekte
- 10.5 Nebenläufigkeit
- 10.5.1 Serialisierung von nebenläufigen Ereignissen
- 10.5.2 subscribeOn und Scheduler
- 10.5.3 observeOn
- 10.6 Fehlerbehandlung
- 10.6.1 Fehlerereignisse auslösen
- 10.6.2 Auf Fehler reagieren
- 10.7 Rückstau und Flusskontrolle
- 10.7.1 Reduktion der Menge der Ereignisse
- 10.7.2 Flowables
- 10.8 Testen reaktiver Streams
- 10.9 Zusammenfassung
- 11 Testen mit und von Funktionen
- 11.1 Funktionsparameter bei JUnit 5
- 11.2 AssertJ: Eine DSL für Unit-Tests
- 11.3 Eigenschaftsbasiertes Testen nach QuickCheck
- 11.3.1 Generatoren von Zufallswerten
- 11.3.2 Tests
- 11.3.3 Shrinken der Werte
- 11.4 Zusammenfassung
- 12 Weiterführende Konzepte
- A Bibliografie
- B Laufzeitexperimente Parallele Streams
- Index.