Um den Buchclub zu Funktionale Programmierung in Java geht es in
der einhundertachtundfünfzigsten Episode des IT-Berufe-Podcasts.
TL;DR Ich empfehle dir "Funktionale Programmierung in Java" von
Herbert Prähofer als Lektüre ab dem zweiten Ausbildungsjahr. Das
Buch vermittelt funktionale Grundlagen mit ausführlichen
Codebeispielen und behandelt auch asynchronen Code sowie
eigenschaftsbasierte Tests. Für deine Praxis und mögliche
Prüfungsfragen sind besonders reine Funktionen, Funktionen höherer
Ordnung und unveränderbare Daten interessant. Mit map und flatMap
kannst du Daten verarbeiten und Funktionsaufrufe verketten, während
CompletableFuture dir hilft, mit später verfügbaren Ergebnissen zu
arbeiten. Kapitelmarken [00:00:00] Buchclub: Funktionale
Programmierung in Java [00:01:53] Funktionale Konzepte für
IT-Azubis und Prüfungen [00:05:09] Stärken des Buchs und praxisnahe
Beispiele [00:08:38] Java-Schwerpunkt und anspruchsvolle Beispiele
[00:11:41] Buchkapitel: Einstieg und sprachliche Grundlagen
[00:13:08] Seiteneffekte und Funktionsparameter [00:14:28]
Funktionen kombinieren und funktionale Datenstrukturen [00:15:47]
Streams und parallele Verarbeitung [00:17:11] Asynchronität und
Reactive Streams im Buch [00:18:30] Eigenschaftsbasierte Tests und
Shrinking [00:20:54] Weiterführende Konzepte und Leseempfehlung
[00:22:04] Funktionale Grundlagen für mögliche Prüfungsfragen
[00:23:06] Lambda-Ausdrücke als anonyme Funktionen [00:25:00]
Typ-Inferenz und statische Typisierung [00:27:41] Algebraische
Datentypen: Produkt- und Summentypen [00:32:13] Pattern-Matching
[00:34:47] Generics und parametrisierbare Klassen [00:37:34] Ko-
und Kontravarianz [00:42:15] Begrenzte Wildcards in Java [00:43:25]
Grundprinzipien der funktionalen Programmierung [00:44:01]
Funktionen als First Class Citizens [00:45:22] Reine Funktionen und
Seiteneffekte [00:47:52] Funktionen höherer Ordnung [00:50:43]
Bedarfsauswertung und unendliche Folgen [00:53:18] Unveränderbare
Datenstrukturen [00:55:40] Rekursion und Tail Call Optimization
[00:58:21] Referenzielle Transparenz [00:59:59] Funktoren und map
[01:01:24] Monoide, fold und neutrale Elemente [01:04:52] Monaden
und flatMap [01:08:46] Funktionsketten und Streams im Alltag
[01:11:18] Asynchrone Abläufe und reagierende Anwendungen
[01:13:09] CompletableFuture und später verfügbare Ergebnisse
[01:14:32] Optional und Future über Funktionen verarbeiten
[01:16:48] Rückblick und Einordnung für die Prüfung [01:19:16]
Ergänzende Links und Feedback Inhalt Die folgenden Inhalte werden
im Buch besprochen. Meiner Meinung nach sollte jeder Azubi zum
Fachinformatiker Anwendungsentwicklung diese Begriffe wenigstens
einmal gehört haben, besser noch sie mit eigenen Worten erklären
können. Die funktionale Programmierung ist neben der
Objektorientierung heutzutage sicherlich eine gängige
Vorgehensweise. Für die anderen IT-Berufe sind viele Inhalte
sicherlich etwas zu speziell. Allerdings sollte jeder ITler
zumindest die verbreiteten Programmierparadigmen auseinanderhalten
können. Und dazu zählen meiner Meinung nach auch einige wichtige
Schlagworte. So wie bei der Objektorientierung Vererbung und
Polymorphie erklärt werden müssen, sollte man bei der funktionalen
Programmierung Funktionen höherer Ordnung oder reine Funktionen
erläutern können. Grundlagen Lambda-Ausdrücke: Anonyme Funktionen
in einer kurzen Schreibweise, meist mit einem "Pfeil" als Trenner
zwischen Methodenkopf und -rumpf (z.B. ->). Typinferenz:
Implizite Ableitung der Datentypen z.B. von Funktionsparametern aus
dem Kontext, z.B. var text = "Text" (text ist "automatisch" ein
String). Algebraische Datentypen Produkttypen: Der Datentyp wird
definiert durch die Kombination verschiedener Werte. Das sind
letztlich unsere bekannten Objekte bzw. Structs. Summentypen: Der
Datentyp wird definiert als Liste möglicher Alternativen bzw.
Varianten, z.B. ist eine Krankenversicherung entweder eine
GesetzlicheKrankenversicherung oder eine
PrivateKrankenversicherung. Hierbei müssen die Alternativen nicht
in einer Vererbungsbeziehung stehen, wie man am Beispiel vermuten
könnte. Pattern Matching: Kontrollstruktur, die Datentypen
"zerlegen" kann. Quasi switch "on steroids". Generics: Datentypen,
die mit anderen Datentypen parametriert werden können. Sie bieten
allgemeingültige Algorithmen an, die auf mehreren Datentypen
ausgeführt werden können. Ko- und Kontravarianz: Legen fest, welche
Verallgemeinerungen bzw. Spezialisierungen bei Typparametern von
generischen Klassen erlaubt sind. Beispiele: Kovarianz: List
students = new List(); Kontravarianz: List students = new List();
Prinzipien der funktionalen Programmierung Funktionsobjekte (first
class citizens): Funktionen sind fester Bestandteil der Sprache und
können z.B. Variablen zugewiesen oder als Parameter übergeben
werden. Reine Funktionen (pure functions): Funktionen haben keine
Seiteneffekte. Sie liefern zum gleichen Input immer den gleichen
Output. Funktionen höherer Ordnung (higher order functions):
Funktionen, die andere Funktionen zurückgeben oder als Parameter
bekommen. Bedarfsauswertung (lazy evaluation): Ein Ausdruck wird
erst dann ausgewertet, wenn sein Wert auch wirklich benötigt wird.
Unveränderbarkeit (immutability): Bestehende Werte sollen nicht
mehr verändert werden. Stattdessen werden immer neue Werte erzeugt.
Rekursion (recursion): Das Mittel der Wahl zur Iteration ohne
veränderliche Variablen. Referentielle Transparenz (referential
transparency): Ein Ausdruck kann jederzeit durch seinen Wert
ersetzt werden und umgekehrt. Funktionale Datenstrukturen
Funktoren: Bieten die Funktion map() an, um den enthaltenen
Datentypen in einen anderen zu transformieren. Beispiel: Optional.
Monoide: Mit Monoiden kann man eine Menge von Elementen zu einem
Gesamtergebnis verknüpfen, es also reduzieren (fold). Dafür wird
ein neutrales Element und eine Reduktionsfunktion benötigt.
Beispiel: Addition ganzer Zahlen mit neutralem Element 0. Monaden:
Bieten die Funktionen of() und flatMap() an, um den enthaltenen
Datentypen in einen anderen zu transformieren, wobei das Ergebnis
dieser Transformation selbst wieder eine Monade ist. Beispiel:
Stream. Listenverarbeitung mit Streams Grundlagen von map(),
filter() und reduce. Parallele Streams und Eignung von Aufgaben für
die Parallelisierung Sonstiges Asynchronität mit CompletableFutures
und Reactive Streams Property Based Testing mit Quickcheck Ein
komplett anderer Ansatz, um Funktionen zu testen. Statt Input und
erwarteten Output selbst zu definieren, werden zufällige
Input-Werte generiert und allgemeine Eigenschaften des Ergebnisses
geprüft, z.B. dass bei einer Konkatenation zweiter Strings die
Länge des Ergebnisses immer größer oder gleich der Länge des ersten
Strings sein muss. Was mir am Buch sehr gut gefällt Es werden nicht
nur die Grundlagen der funktionalen Programmierung erläutert,
sondern auch viele andere wichtige Begriffe rund um die moderne
Programmierung. Gerade die Grundlagen werden sehr verständlich
erklärt und mit vielen praxisnahen Beispielen angereichert. Es
werden auch sehr moderne Konzepte wie wie Reactive Streams und
Property Based Testing erläutert. Einige Grundlagen, die jeder
Informatiker einmal gehört haben sollte, werden ebenfalls
behandelt, z.B. Algorithmen zur Tiefensuche. Auch einige
Entwurfsmuster werden im Detail erklärt und mit der funktionalen
Lösung verglichen. Die technischen Hintergründe der Implementierung
in Java werden gut verständlich erläutert. Das sollte heutzutage
jeder Java-Entwickler kennen! Was mir am Buch nicht ganz so gut
gefällt Die Inhalte haben natürlich einen starken Fokus auf die
Implementierung in Java. Man kann zwar auch als
Nicht-Java-Entwickler im Bereich der Grundlagen einiges mitnehmen,
aber am besten geeignet ist das Buch wohl für
Hardcore-Java-Entwickler. Man merkt, dass der Autor Hochschuldozent
ist. Die Beschreibungen und Beispiele sind teilweise etwas
akademisch. Auch wenn die funktionale Programmierung ihren Ursprung
in der Mathematik hat, ist das vielleicht für Azubis manchmal etwas
schwere Kost. Die verwendeten Beispiele sind teilweise sehr
umfangreich. Sehr lange Codeausschnitte, die schwer
nachzuvollziehen sind, hätten vielleicht gekürzt werden können.
Fazit Ich kann das Buch uneingeschränkt weiterempfehlen. Es
vermittelt einen sehr guten Überblick über moderne
Programmmiertechniken und die funktionale Programmierung. Auch
Azubis werden es gut verstehen können. Ich empfehle die Literatur
allerdings erst ab dem zweiten Lehrjahr, wenn schon einige
Programmierprojekte umgesetzt wurden. Auch als Nachschlagewerk für
zentrale Begriff der funktionalen Programmierung finde ich das Buch
sehr gut, da die Begriffe kurz und prägnant definiert und mit
Beispielen erklärt werden. Insbesondere für Java-Entwickler
empfehle ich das Buch zum Verständnis der technischen
Implementierung der funktionalen Programmierung in Java.
Literaturempfehlungen Naja, was soll ich wohl anderes empfehlen als
das besprochene Buch Funktionale Programmierung in Java*? :-) *
Links Permalink zu dieser Podcast-Episode RSS-Feed des Podcasts
Gregor Trefs über funktionale Programmierung, Konferenzen und
Fachartikel Algebraic data type Summentypen Produkttypen
Property-based Testing mit JUnit QuickCheck Präsentation:
Property-based Testing mit JUnit-Quickcheck Railway Oriented
Programming in Java Präsentation: Railway Oriented Programming -
Funktionaler programmieren ohne Exceptions Zusammenfassung Das Buch
für deine Ausbildung Mit meinen IT-Azubis lese ich regelmäßig
Fachbücher. "Funktionale Programmierung in Java" von Herbert
Prähofer, Professor an der Universität Linz, empfehle ich dir als
deutschsprachigen Einstieg in funktionale Konzepte und ihre
Umsetzung in Java. Meine Besprechung stammt aus dem Jahr 2020.
Durch die ausführlichen Codebeispiele kannst du nachvollziehen, wie
die Konzepte im Alltag funktionieren....
Kommentare (0)
Melde dich an, um einen Kommentar zu schreiben.