Funktionale Programmierung in Java

Book description

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 Programmiersprachen, die funktionale Programmierung (z.B. Scala, Kotlin) einfach möglich machen. Das Buch richtet sich sowohl an Einsteiger in Java, die einen tieferen Einblick in die funktionale Seite der Sprache erhalten möchten, als auch an erfahrene Java-Entwickler, die ihre tägliche Arbeit um funktionale Aspekte erweitern möchten.

Table of contents

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

Product information

  • Title: Funktionale Programmierung in Java
  • Author(s): Herbert Prähofer
  • Release date: July 2020
  • Publisher(s): dpunkt
  • ISBN: 9783864907579