Skip to main content

Funktionale Programmierung

Java ist eine objektorientierte Programmiersprache. Die Sprache ist um das Konzept von Klassen aufgebaut. Alle Datentypen (mit Ausnahme der 6 primitiven Datentypen) sind in einer Klassenhierarchie angeordnet. Flexibilität im Design wird über Interfaces und abstrakte Klassen, im Zusammenspiel mit Polymorphismus und später Bindung erreicht. Ein wichtiges Prinzip, das direkt durch Klassen umgesetzt ist, ist das Information hiding. Der Zustand eines Objekts, das heisst die Felder, sollen nur von Methoden der Klasse verändert werden können und sind von Zugriff von aussen geschützt.

Neben objektorientierter Programmierung gibt es aber auch noch andere Programmierparadigmen. Ein wichtiges Paradigma ist die funktionale Programmierung. Obwohl dieses Paradigma älter ist als die Objektorientierung, hat es erst in den letzten Jahren Einzug in die Mainstream-Programmierung gefunden. Auch in Java gibt es entsprechend seit einigen Jahren Unterstützung für die funktionale Programmierung.

In diesem Artikel werden wir dieses Paradigma kurz einführen und die wichtigsten Eigenschaften diskutieren.

Was ist funktionale Programmierung

Wie es der Name bereits sagt, stehen bei der funktionalen Programmierung Funktionen im Zentrum. Funktionen werden dabei im mathematischen Sinne gedacht. Es sind einfach Abbildungen f:IOf : I \to O die eine Eingabe entgegennehmen und entsprechend eine Ausgabe (einen neuen Wert) erzeugen. Programme selbst sind dann nichts anderes, als die Hintereinanderausführung vieler Funktionen.

Wir wollen uns dies zunächst am Beispiel von zwei Funktionen anschauen. Angenommen, wir haben eine Funktion f:IRf : I \to R. Diese nimmt eine Eingabe (also einen Wert) vom Typ II entgegen und berechnet daraus einen Wert von Typ RR. Zudem soll es eine zweite Funktion g:ROg : R \to O geben. Diese nimmt wiederum einen Wert vom Typ RR entgegen und berechnet daraus einen Wert vom Typ OO. Dann können wir ein grösseres Programm hh schreiben, indem wir die Funktionen hintereinander ausführen:

h:IOh(x)=g(f(x))h : I \to O \\ h(x) = g(f(x))

Ein konkretes Beispiel in Java könnte wie folgt aussehen:

class FunctionalTest {
static double square(double x) {
return x * x;
}

static int round(double number) {
return (int) (number + 0.5);
}

static int roundSquared(double x) {
return round(square(x));
}
}

In diesem Beispiel werden die zwei kleinen "Programme" round und square zu einem grösseren Programm roundSquared zusammengefügt.

Diese Hintereinanderausführung von Funktionen klingt zuerst einmal nicht besonders spannend. Ein weiteres Element, welches die funktionale Programmierung sehr mächtig macht, ist, dass darin Funktionen einfach Werte sind. Damit können diese zum Beispiel als Parameter an andere Funktionen (Methoden) übergeben werden. Oder sie können als Rückgabewert aus einer Methode zurückgegeben werden. Wie wir noch sehen werden, macht es dies möglich, gewisse Arten von Berechnungen sehr elegant und verständlich auszudrücken.

Ein weiteres Merkmal von diesem Programmierstil ist, dass Daten von einer Funktion nicht verändert werden. In der objektorientierten Programmierung wird oft das Verändern von Daten nur von Methoden eines Objektes erlaubt. Im Gegensatz dazu wird es in der funktionalen Programmierung gänzlich vermieden. Stattdessen werden die Eingabedaten einer Funktion wenn nötig kopiert, und nur diese Kopie wird verändert. Dies macht das Verstehen von Programmen einfacher, da wir nicht im Kopf Buch führen müssen, welche Daten von welcher Funktion verändert wurden.

Funktionale Programmierung und Java

Java ist und bleibt eine objektorientierte Programmiersprache. Jedoch haben viele Konzepte aus der funktionalen Programmierung den Einzug in Java geschafft. Die Prominentesten davon sind Lambda-Ausdrücke und Streams. Mittels Lambda Ausdrücken können wir Funktionen an Methode übergeben. Streams erlauben es uns, Daten mittels Lambda-Ausdrücken zu transformieren.


Haben Sie Fragen oder Bemerkungen? Schreiben Sie diese doch ins Forum.