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

Descripción completa

Detalles Bibliográficos
Otros Autores: Prähofer, Herbert, author (author)
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.