Vorwort

Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com

Ein Geist, der durch eine neue Erfahrung gedehnt wird, kann nie wieder in seine alten Dimensionen zurückkehren.

Oliver Wendell Holmes, Jr.


Die Entwicklung von Software ist ein ziemlich komplexes Unterfangen.Als Java-Entwickler versuchen wir in der Regel, diese Komplexität mit objektorientierter Programmierung (OOP) als Metapher für die Darstellung der Dinge, die wir entwickeln, wie z. B. Datenstrukturen, in den Griff zu bekommen, und verwenden einen primär imperativ ausgerichteten Codierungsstil, um den Zustand unseres Programms zu verwalten. Obwohl OOP ein bekannter und bewährter Ansatz für die Entwicklung sinnvoller Software ist, eignet er sich nicht für jedes Problem. Wenn wir jedem Problem die OOP-Prinzipien aufzwingen, anstatt geeignetere Werkzeuge und Paradigmen zu verwenden, die uns ebenfalls zur Verfügung stehen, führen wir möglicherweise ein gewisses Maß an unnötiger Komplexität ein. Das Paradigma der funktionalen Programmierung (FP) bietet einen alternativen Ansatz für die Lösung von Problemen.

Die funktionale Programmierung ist keine neue Idee, sondern sogar älter als die objektorientierte Programmierung! Sie tauchte erstmals in den frühen Jahren der Informatik, in den 1950er Jahren, in der Programmiersprache Lispauf und wird seitdem häufig in der Wissenschaft und in Nischenbereichen eingesetzt.1 und wurde in der Wissenschaft und in Nischenbereichen häufig verwendet. In den letzten Jahren hat das Interesse an funktionalen Paradigmen jedoch zugenommen.

Viele neue funktionale Sprachen sind entstanden, und nicht-funktionale Sprachen enthalten in unterschiedlichem Maße funktionale Merkmale. Die Ideen und Konzepte hinter FP sind inzwischen in fast allen gängigen Mehrparadigmen- und Allzwecksprachen enthalten, so dass wir unabhängig vom Kontext und der gewählten Sprache eine Form der funktionalen Programmierung nutzen können. Nichts hält uns davon ab, die besten Teile von FP zu übernehmen und unsere bestehende Art der Programmierung und unsere Softwareentwicklungswerkzeuge zu erweitern - und genau darum geht es in diesem Buch!

In diesem Buch lernst du die Grundlagen der funktionalen Programmierung und wie du dieses Wissen bei deiner täglichen Arbeit mit Java anwenden kannst.

Neue Hardware braucht eine neue Denkweise

Die Hardware entwickelt sich in eine neue Richtung. Seit geraumer Zeit sind die Verbesserungen der Single-Core-Leistung nicht mehr so signifikant wie bei jeder vorherigen Prozessorgeneration.Moore's law2 scheint sich zu verlangsamen, aber eine solche Verlangsamung bedeutet nicht, dass sich die Hardware nicht mehr verbessert. Aber statt sich in erster Linie auf die Single-Core-Leistung und noch höhere GHz-Zahlen zu konzentrieren, setzen die Hersteller auf immer mehr Kerne.3 Damit moderne Workloads alle Vorteile der neuen Hardware nutzen können, die mehr Kerne statt schnellerer Kerne bevorzugt, müssen wir Techniken einsetzen, die mehr Kerne zu ihrem Vorteil nutzen, ohne die Produktivität zu beeinträchtigen oder zusätzliche Komplexität einzuführen.

Die horizontale Skalierung deiner Software durch Parallelität ist in der OOP keine leichte Aufgabe. Nicht jedes Problem eignet sich für Parallelität. Mehr Maler könnten einen Raum schneller streichen, aber du kannst die Schwangerschaft nicht beschleunigen, indem du mehr Leute einbeziehst. Wenn das Problem aus seriellen oder voneinander abhängigen Aufgaben besteht, ist Gleichzeitigkeit der Parallelität vorzuziehen. Aber die Parallelität kommt erst richtig zur Geltung, wenn ein Problem in kleinere, nicht zusammenhängende Teilprobleme zerfällt. Hier kommt die funktionale Programmierung ins Spiel. Die zustandslose und unveränderliche Natur der idiomatischen FP bietet alle notwendigen Werkzeuge, um kleine, zuverlässige, wiederverwendbare und höherwertige Aufgaben zu erstellen, die elegant in parallele und gleichzeitige Umgebungen passen.

Die Einführung einer funktionalen Denkweise fügt deinem Werkzeuggürtel eine weitere Reihe von Werkzeugen hinzu, die es dir ermöglichen, deine täglichen Entwicklungsprobleme auf eine neue Art und Weise anzugehen und deinen Code einfacher und sicherer zu skalieren als zuvor.

Als Nächstes wollen wir uns ansehen, warum Java eine gute Wahl für funktionale Programmierung sein kann.

Java kann auch funktional sein

Es gibt viele Programmiersprachen, die sich hervorragend für die funktionale Programmierung eignen.Haskell ist ein Favorit, wenn du eine rein funktionale Sprache bevorzugst, die fast keine Unterstützung für einen imperativen Programmierstil bietet.Elixir ist eine weitere spannende Option, die die Erlang Virtual Machine nutzt.4 Du musst das riesige JVM-Ökosystem jedoch nicht verlassen, um FP-fähige Sprachen zu finden.Scala glänzt durch die Kombination von OOP- und FP-Paradigmen in einer prägnanten Hochsprache.Eine weitere beliebte Wahl ist Clojure, das von Grund auf als funktionale Sprache mit einem dynamischen Typensystem entwickelt wurde.

In einer perfekten Welt hättest du den Luxus, die perfekte funktionale Sprache für dein nächstes Projekt zu wählen. In der Realität hast du vielleicht gar keine Wahl, welche Sprache du verwenden willst, und musst die Karten spielen, die dir gegeben werden.

Als Java-Entwickler würdest du Java verwenden, das in der Vergangenheit als nicht ideal für funktionale Programmierung angesehen wurde. Bevor wir jedoch fortfahren, muss ich betonen, dass du die meisten funktionalen Prinzipien in Java implementieren kannst, unabhängig von der tief integrierten Unterstützung auf Sprachebene.5Dennoch wird der daraus resultierende Code nicht so prägnant und einfach zu verstehen sein wie in anderen Sprachen, die einen funktionalen Ansatz von vornherein zulassen. Dieser Vorbehalt schreckt viele Entwickler davon ab, funktionale Prinzipien in Java anzuwenden, obwohl sie vielleicht einen produktiveren Ansatz oder eine bessere Gesamtlösung gefunden hätten.

In der Vergangenheit hielten viele Menschen Java für ein sich langsam entwickelndes Ungetüm, eine "zu groß, um auszusterben"-Unternehmenssprache, wie eine modernere Version von COBOL oder Fortran. Und meiner Meinung nach stimmt das auch teilweise, zumindest war es in der Vergangenheit so. Erst mit Java 9 und den verkürzten Veröffentlichungszeiträumen hat sich das Tempo erhöht.6Es dauerte fünf Jahre, bis Java von der Version 6 auf die Version 7 (2006-2011) umstieg. Und obwohl es wichtige neue Funktionen gab, wie try-with-resources, war keine davon "bahnbrechend". Die wenigen und langsamen Änderungen in der Vergangenheit führten dazu, dass Projekte und Entwickler nicht das "neueste und beste" Java Development Kit (JDK) annahmen und viele Verbesserungen der Sprache verpassten. Drei Jahre später, 2014, wurde die nächste Version, Java 8, veröffentlicht.Dieses Mal wurde eine der wichtigsten Änderungen für die Zukunft von Java eingeführt: Lambda-Ausdrücke.

Eine bessere Grundlage für die funktionale Programmierung war endlich in der wohl bekanntesten objektorientierten Programmiersprache der Welt angekommen und veränderte die Sprache und ihre Idiome erheblich:

Runnable runnable = () -> System.out.println("hello, functional world!");

Die Hinzufügung von Lambda-Ausdrücken war ein entscheidender Schritt, um die funktionale Programmierung in Java endlich als integriertes Sprach- und Laufzeitmerkmal nutzen zu können. Darüber hinaus wurde Java-Entwicklern eine ganz neue Welt von Ideen und Konzepten eröffnet. Viele der neuen Funktionen des JDK, wie Streams, der Typ Optional oder CompletableFuture, sind nur dank der Lambda-Ausdrücke auf Sprachebene und anderer funktionaler Erweiterungen von Java auf so prägnante und unkomplizierte Weise möglich.

Diese neuen Idiome und Möglichkeiten, Dinge mit FP in Java zu tun, mögen seltsam erscheinen und sind vielleicht nicht selbstverständlich, vor allem, wenn du in erster Linie an OOP gewöhnt bist. In diesem Buch zeige ich dir, wie du eine Denkweise entwickelst, die dir hilft, FP-Prinzipien auf deinen Code anzuwenden und ihn besser zu machen, ohne dass du "voll funktional" werden musst.

Warum ich dieses Buch geschrieben habe

Nachdem ich eine andere Mehrzwecksprache mit hervorragender Unterstützung für funktionale Programmierung -Swift - verwendet und die Vorteile aus erster Hand gesehen hatte, führte ich nach und nach immer mehr funktionale Prinzipien auch in meine Java-basierten Projekte ein. Dank der Lambda-Ausdrücke und all der anderen Funktionen, die in Java 8 und später eingeführt wurden, waren alle notwendigen Werkzeuge leicht verfügbar. Aber nachdem ich diese Werkzeuge häufiger benutzt und mit meinen Kollegen diskutiert hatte, wurde mir etwas klar: Wie man Lambdas, Streams und all die anderen funktionalen Funktionen von Java einsetzt, ist leicht zu verstehen. Aber ohne ein tieferes Verständnis dafür, warum und wann man sie einsetzen sollte - und wann nicht -, wird man ihr volles Potenzial nicht ausschöpfen können, und es wird nur "neuer Wein in alten Schläuchen" sein.

Deshalb habe ich mich entschlossen, dieses Buch zu schreiben, um die verschiedenen Konzepte zu beleuchten, die eine Sprache funktional machen, und um zu zeigen, wie du sie in deinen Java-Code einbauen kannst, entweder mit den Werkzeugen, die das JDK bereitstellt, oder indem du sie selbst erstellst. Ein funktionaler Ansatz für deinen Java-Code wird höchstwahrscheinlich den Status quo in Frage stellen und gegen die bewährten Methoden verstoßen, die du bisher verwendet hast. Aber wenn du eine funktionale Herangehensweise wie Unveränderlichkeit und reine Funktionen akzeptierst, wirst du in der Lage sein, prägnanteren, vernünftigeren und zukunftssicheren Code zu schreiben, der weniger anfällig für Fehler ist.

Wer sollte dieses Buch lesen?

Dieses Buch ist für dich, wenn du neugierig auf funktionale Programmierung bist und wissen willst, was es damit auf sich hat und wie du sie in deinem Java-Code anwenden kannst. Vielleicht verwendest du bereits einige funktionale Java-Typen, möchtest aber tiefergehende Kenntnisse darüber erlangen, warum und wie du sie effektiver einsetzen kannst.

Man muss kein OOP-Experte sein, aber das Buch ist kein Anfängerhandbuch für Java oder OOP. Du solltest bereits mit der Java-Standardbibliothek vertraut sein. Vorkenntnisse in funktionaler Programmierung sind nicht erforderlich. Jedes Konzept wird mit einer Erklärung und Beispielen vorgestellt.

Das Buch behandelt Java 17 als die neueste Long-Term-Support (LTS)-Version, die zum Zeitpunkt der Veröffentlichung verfügbar war. Da viele Entwicklerinnen und Entwickler Projekte mit früheren Versionen unterstützen müssen, wird die allgemeine Grundlage die vorherige LTS, Java 11, sein. Aber auch wenn du mit Java 8 arbeitest, sind viele der behandelten Themen relevant. Einige Kapitel beziehen sich jedoch auf neuere Funktionen, wie z.B. Records, die in Java 14 eingeführt wurden.

Dieses Buch ist vielleicht nicht das Richtige für dich, wenn du auf der Suche nach einem Fachbuch bist, das dir "fertige" Lösungen präsentiert. Sein Hauptziel ist es, funktionale Konzepte und Idiome vorzustellen und dir zu zeigen, wie du sie in deinen Java-Code einbauen kannst.

Was du lernen wirst

Am Ende dieses Buches wirst du ein grundlegendes Wissen über funktionale Programmierung und die ihr zugrunde liegenden Konzepte haben und wissen, wie du dieses Wissen in deiner täglichen Arbeit anwenden kannst. Jeder funktionale Java-Typ wird dir zur Verfügung stehen und du wirst in der Lage sein, alles, was dem JDK fehlt, selbst zu bauen, wenn es nötig ist.

Du lernst die Konzepte und die Bedeutung der folgenden Aspekte der funktionalen Programmierung kennen:

Zusammensetzung

Baue modulare und leicht zusammensetzbare Blöcke.

Ausdruckskraft

Schreibe einen prägnanteren Code, der seine Absicht klar zum Ausdruck bringt.

Sicherer Code

Erstelle sicherere Datenstrukturen ohne Seiteneffekte, die sich nicht mit Race Conditions oder Sperren befassen müssen, die schwer zu verwenden sind, ohne Fehler zu verursachen.

Modularität

Unterteile größere Projekte in leichter zu verwaltende Module.

Instandhaltbarkeit

Verwende kleinere Funktionsblöcke mit weniger Verbindungen, um Änderungen und Refactoring sicherer zu machen, ohne andere Teile deines Codes zu zerstören.

Datenmanipulation

Baue effiziente Datenverarbeitungspipelines mit weniger Komplexität.

Leistung

Unveränderlichkeit und Vorhersagbarkeit ermöglichen es dir, mit Parallelität horizontal zu skalieren, ohne viel darüber nachzudenken.

Auch ohne voll funktional zu werden, wird dein Code von den in diesem Buch vorgestellten Konzepten und Idiomen profitieren - und zwar nicht nur dein Java-Code. Du wirst die Herausforderungen der Entwicklung mit einer funktionalen Denkweise angehen und deine Programmierung unabhängig von der verwendeten Sprache oder dem Paradigma verbessern.

Was ist mit Android?

Es ist schwer, über Java zu sprechen, ohne auch Android zu erwähnen. Obwohl du Android-Anwendungen in Java schreiben kannst, sind die zugrunde liegende API und die Laufzeit nicht dieselben. Was bedeutet das also für die Anwendung eines funktionalen Ansatzes in Java für Android-Anwendungen? Um das besser zu verstehen, müssen wir uns zunächst ansehen, was Java für Android von "normalem" Java unterscheidet.

Android führt Java-Bytecode nicht direkt auf einer minimalistischen JVM aus, die für kleinere Geräte optimiert ist, wie die Java Platform Micro Edition. Stattdessen wird der Bytecode neu kompiliert.Der Dex-Compiler erzeugt Dalvik-Bytecode, der dann auf einer speziellen Laufzeitumgebung ausgeführt wird: der Android Runtime (ART) und zuvor auf der Dalvik Virtual Machine.7

Die Neukompilierung von Java-Bytecode in Dalvik-Bytecode ermöglicht es den Geräten, hochoptimierten Code auszuführen und so das Beste aus ihren Hardwarebeschränkungen herauszuholen. Für dich als Entwickler bedeutet das jedoch, dass dein Code zwar oberflächlich betrachtet wie Java aussieht und sich auch so anfühlt - der größte Teil der öffentlichen API ist identisch -, es aber keine Funktionsgleichheit zwischen dem JDK und dem Android SDK gibt, auf die du dich verlassen kannst. Die Eckpfeiler dieses Buches - Lambda-Ausdrücke und Streams - gehörten beispielsweise lange Zeit zu den fehlenden Funktionen in Android.

Das Android Gradle Plugin unterstützt seit Version 3.0.0 einige der fehlenden funktionalen Funktionen (Lambda-Ausdrücke, Methodenreferenzen, Standard- und statische Schnittstellenmethoden) durch das sogenannte Desugaring: Der Compiler verwendet Bytecode-Transformationen, um eine Funktion im Hintergrund zu replizieren, ohne die neue Syntax zu unterstützen oder eine Implementierung in der Laufzeit selbst bereitzustellen.

Die nächste Hauptversion, 4.0.0, fügte noch mehr funktionale Funktionen hinzu: Streams, Optionals und das java.util.function Paket. Damit kannst du auch als Android-Entwickler von den funktionalen Paradigmen und Tools profitieren, die in diesem Buch besprochen werden.

Warnung

Obwohl die meisten Funktionen des JDK auch auf Android verfügbar sind, sind sie keine wortgetreuen Kopien und können unterschiedliche Leistungsmerkmale aufweisen.8 Die verfügbaren Funktionen sind in der offiziellen Dokumentation zur Java 8+ Unterstützung aufgeführt.

Ein funktionaler Ansatz für Android

2019 hat Kotlin den Mantel der bevorzugten Sprache für Android-Entwickler/innen von Java übernommen. Es ist eine Multiplattformsprache, die hauptsächlich auf die JVM abzielt, aber auch für JavaScript und mehrere native Plattformen kompiliert.9 Kotlin will ein "modernes und prägnanteres" Java sein und behebt viele der fragwürdigen Mängel von Java und den Ballast, der sich im Laufe der Jahre durch die Abwärtskompatibilität angesammelt hat, ohne auf alle Frameworks und Bibliotheken zu verzichten, die Java zur Verfügung stehen. Und es ist zu 100 % interoperabel: Du kannst Java und Kotlin problemlos im selben Projekt mischen.

Ein offensichtlicher Vorteil von Kotlin gegenüber Java ist, dass viele funktionale Konzepte und Idiome in der Sprache selbst enthalten sind. Als eine andere Sprache hat Kotlin jedoch seine eigenen Idiome und bewährten Methoden, die sich von denen Javas unterscheiden. Auch der generierte Bytecode kann sich unterscheiden, wie z.B. der, der zur Erzeugung von Lambdas verwendet wird.10 Der größte Vorteil von Kotlin ist der Versuch, eine prägnantere und vorhersehbarere Sprache im Vergleich zu Java zu schaffen. Und genauso wie du in Java funktionaler sein kannst, ohne voll funktionsfähig zu sein, kannst du in deinen Android-Projekten auch reine Kotlin-Funktionen nutzen, ohne voll auf Kotlin umzusteigen. Wenn du Java und Kotlin mischst, kannst du die besten Funktionen aus beiden Sprachen auswählen.

Bedenke, dass der Schwerpunkt dieses Buches auf der Sprache Java und dem JDK liegt. Dennoch sind die meisten Ideen, die du lernst, auf Android übertragbar, auch wenn du Kotlin verwendest. Es gibt jedoch keine speziellen Überlegungen für Android oder Kotlin in diesem Buch.

Navigieren in diesem Buch

Dieses Buch besteht aus zwei verschiedenen Teilen:

  • Teil I, Funktionale Grundlagen, führt in die Geschichte und die Kernkonzepte der funktionalen Programmierung ein, zeigt, wie Java diese Konzepte implementiert und welche Typen uns als Entwickler bereits zur Verfügung stehen.

  • Teil II, Ein funktionaler Ansatz, ist ein themenbezogener Tieftauchgang durch die allgemeineren Programmierkonzepte und wie man sie mit funktionalen Prinzipien und den neu verfügbaren Tools erweitert. Bestimmte Funktionen, wie Records und Streams, werden mit erweiterten Beispielen und Anwendungsfällen hervorgehoben.

Wenn du die Kapitel in der richtigen Reihenfolge liest, hast du den größten Nutzen davon, denn sie bauen in der Regel aufeinander auf. Du kannst aber auch einfach die Teile überfliegen, die dich interessieren, und zwischen ihnen hin- und herspringen. Alle notwendigen Verbindungen sind mit Querverweisen versehen, um eventuelle Lücken zu füllen.

In diesem Buch verwendete Konventionen

In diesem Buch werden die folgenden typografischen Konventionen verwendet:

Kursiv

Weist auf neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen hin.

Constant width

Wird für Programmlistings und innerhalb von Absätzen verwendet, um auf Programmelemente wie Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter hinzuweisen.

Constant width bold

Zeigt Befehle oder anderen Text an, der vom Benutzer wortwörtlich eingetippt werden sollte.

Constant width italic

Zeigt Text an, der durch vom Benutzer eingegebene Werte oder durch kontextabhängige Werte ersetzt werden soll.

Tipp

Dieses Element steht für einen Tipp oder eine Anregung.

Hinweis

Dieses Element steht für einen allgemeinen Hinweis.

Warnung

Dieses Element weist auf eine Warnung oder einen Warnhinweis hin.

Code-Beispiele verwenden

Der Quellcode des Buches ist auf GitHub verfügbar: https://github.com/benweidig/a-functional-approach-to-java. Neben kompilierbarem Java-Code gibt es auch JShell-Skripte, um den Code einfacher auszuführen.

Wenn du eine technische Frage oder ein Problem mit den Codebeispielen hast, schicke bitte eine E-Mail an

Dieses Buch soll dir helfen, deine Arbeit zu erledigen. Wenn in diesem Buch Beispielcode angeboten wird, darfst du ihn in deinen Programmen und deiner Dokumentation verwenden. Du musst uns nicht um Erlaubnis fragen, es sei denn, du reproduzierst einen großen Teil des Codes. Wenn du zum Beispiel ein Programm schreibst, das mehrere Teile des Codes aus diesem Buch verwendet, brauchst du keine Erlaubnis. Der Verkauf oder die Verbreitung von Beispielen aus O'Reilly-Büchern erfordert jedoch eine Genehmigung. Die Beantwortung einer Frage mit einem Zitat aus diesem Buch und einem Beispielcode erfordert keine Genehmigung. Wenn du einen großen Teil des Beispielcodes aus diesem Buch in die Dokumentation deines Produkts aufnimmst, ist eine Genehmigung erforderlich.

Wir freuen uns über eine Namensnennung, verlangen sie aber in der Regel nicht. Eine Quellenangabe umfasst normalerweise den Titel, den Autor, den Verlag und die ISBN. Ein Beispiel: "A Functional Approach to Java von Ben Weidig (O'Reilly). Copyright 2023 Benjamin Weidig, 978-1-098-10992-9."

Wenn du der Meinung bist, dass die Verwendung von Code-Beispielen nicht unter die Fair-Use-Regelung oder die oben genannte Erlaubnis fällt, kannst du uns gerne unter kontaktieren

O'Reilly Online Learning

Hinweis

Seit mehr als 40 Jahren bietet O'Reilly Media Schulungen, Wissen und Einblicke in Technologie und Wirtschaft, um Unternehmen zum Erfolg zu verhelfen.

Unser einzigartiges Netzwerk von Experten und Innovatoren teilt sein Wissen und seine Erfahrung durch Bücher, Artikel und unsere Online-Lernplattform. Die Online-Lernplattform von O'Reilly bietet dir On-Demand-Zugang zu Live-Trainingskursen, ausführlichen Lernpfaden, interaktiven Programmierumgebungen und einer umfangreichen Text- und Videosammlung von O'Reilly und über 200 anderen Verlagen. Weitere Informationen erhältst du unter https://oreilly.com.

Bitte richte Kommentare und Fragen zu diesem Buch an den Verlag:

Wir haben eine Webseite für dieses Buch, auf der wir Errata, Beispiele und zusätzliche Informationen auflisten. Du kannst diese Seite unter https://oreil.ly/functional-approach-to-java-1e aufrufen .

Neuigkeiten und Informationen über unsere Bücher und Kurse findest du unter https://oreilly.com.

Finde uns auf LinkedIn: https://linkedin.com/company/oreilly-media

Folge uns auf Twitter: https://twitter.com/oreillymedia

Schau uns auf YouTube: https://www.youtube.com/oreillymedia

Danksagungen

Dieses Buch ist für Alexander Neumer, den besten Mentor, den ich mir in meiner frühen Karriere hätte wünschen können. Ohne ihn wäre ich nicht der Entwickler, der ich heute bin.

Ich möchte vor allem Zan McQuade für ihre Ermutigung danken und dafür, dass sie mir vorgeschlagen hat, mein Geschwafel über funktionales Java in einem Buch zusammenzufassen.

Ein besonderer Dank gebührt auch den technischen Prüfern: Dean Wampler, Venkat Subramaniam, Thiago H. de Paula Figueiredo und A. N. M. Bazlur Rahman. Ihre Unterstützung, ihre Vorschläge und ihre manchmal harsche Kritik während der verschiedenen Phasen des Buches haben es besser gemacht, als ich es selbst je hätte tun können.

Ich möchte mich auch bei Felix Gonschorek und Benjamin Quenzer bedanken, den beiden Freunden und Kollegen, die von Anfang an mit mir "gelitten" haben und mir bis zum Schluss unschätzbares Feedback gegeben haben.

Zu guter Letzt möchte ich mich bei meinem Acquisitions Editor Brian Guerin und allen anderen bei O'Reilly bedanken. Meiner Redakteurin Rita Fernando, die immer einen Weg gefunden hat, ein paar raue Kanten zu polieren und das Beste aus dem herauszuholen, was ich geschrieben habe. Ashley Stussy, der Production Editor, und ihrem Team, die alle meine Layoutwünsche möglich gemacht haben. Nick und Theresa vom O'Reilly Tools Team, die mir geduldig bei allen auftretenden Asciidoc-Problemen geholfen haben. Und all den anderen, die hinter den Kulissen beteiligt waren. Danke schön!

1 Ursprünglich wurde Lisp 1958 spezifiziert und ist die zweitälteste noch gebräuchliche Hochsprache. Sie bildet auch die Grundlage für eine Vielzahl von Programmiersprachen, wie Emacs Lisp oder die funktionale JVM-Sprache Clojure.

2 Das Mooresche Gesetz wurde 1965 von Gordon Moore, dem Mitbegründer von Intel, formuliert. Es besagt, dass sich die Anzahl der Transistoren alle zwei Jahre verdoppelt und damit auch die Leistung pro Kern, die uns zur Verfügung steht. Chris Edwards, "Moore's Law: What Comes Next?" Communications of the ACM, Vol. 64, No. 2 (Feb. 2021): 12-14.

3 N. C. Thompson und Svenja Spanuth, "The Decline of Computers as a General-Purpose Technology", Communications of the ACM, Vol. 64, No. 3 (Mar. 2021): 64-72.

4 Erlang ist eine funktionale und nebenläufigkeitsorientierte Programmiersprache, die für den Aufbau von verteilten und fehlertoleranten Systemen mit geringer Latenz bekannt ist.

5 Dean Wampler zeigt in seinem Buch Functional Programming for Java Developers (O'Reilly) im Detail, wie man die fehlenden funktionalen Programmierfunktionen in Java selbst implementieren und erleichtern kann. Er beschreibt viele Techniken, die vor Version 8 nicht ohne Weiteres machbar waren. Aber jetzt sind viele der Unzulänglichkeiten und Lücken im JDK geschlossen und es bietet viele der Werkzeuge, die notwendig sind, um FP prägnant und unkompliziert einzubinden.

6 Mit der Veröffentlichung der Versionen nach 9 hat Oracle einen schnelleren Veröffentlichungszeitplan für Java mit einem festen Veröffentlichungsrhythmus von sechs Monaten eingeführt. Um diesen engen Zeitplan einhalten zu können, wird nicht jede Version als "Langzeitunterstützung" betrachtet, sondern es werden schneller als bisher neue Funktionen veröffentlicht.

7 Das Android Open Source Project bietet einen guten Überblick über die Funktionen und die Überlegungen, die hinter der Android-Laufzeit stecken.

8 Jake Wharton, ein bekannter Android-Entwickler, gibt einen detaillierten Einblick, wie Android modernen Java-Code desugariert.

9 In der offiziellen Kotlin-Dokumentation findest du eine Übersicht über die unterstützten Plattformen.

10 Jedes Lambda wird zu einer anonymen Klasse kompiliert, die kotlin.jvm.internal.FunctionImpl erweitert, wie in den Funktionstypspezifikationen erklärt.

Get Ein funktionaler Ansatz für Java now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.