SlideShare ist ein Scribd-Unternehmen logo
1 von 308
Downloaden Sie, um offline zu lesen
Art of the state
Funktionale Softwarearchitektur mit Plain Old Java
Gunter Jantzen
¨
Capgemini

16. Januar 2013 1

1

Angepasst an jdk8 lambda-8-b117 vom 21.11.2013
Art of the state

1 / 98
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

2 / 98
Die FunctionalOWL vom Hackerspace Bielefeld
http://hackerspace-bielefeld.de/

Verwendung mit
freundlicher
Genehmigung des
Kunstlers Jonah
¨
Joen Bethlehem.

Art of the state

3 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state

4 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

Art of the state

5 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

¨
ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis.

Art of the state

5 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

Flash

Art of the state

6 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

Jetzt schreibt bitte mal Eure Namen auf die Liste.

Art of the state

6 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

Art of the state

7 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.

Art of the state

7 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.
¨
¨
¨
Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr
Euch ja schon mal uberlegen, wie sich das Aufschreiben
¨
¨
parallelisieren lasst.

Art of the state

7 / 98
Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.
¨
¨
¨
Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr
Euch ja schon mal uberlegen, wie sich das Aufschreiben
¨
¨
parallelisieren lasst.
Aber die Reihenfolge muss stimmen!!

Art of the state

7 / 98
Vorgeschichte

Vorgeschichte

Art of the state

8 / 98
Vorgeschichte

Das Entscheidungsproblem

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

9 / 98
Vorgeschichte

Das Entscheidungsproblem

Gullivers Reise nach Laputa

Art of the state

10 / 98
Vorgeschichte

Das Entscheidungsproblem

Gullivers Reise nach Laputa
1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in
der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle
¨
mogliche Wahrheiten zu finden.

Art of the state

10 / 98
Vorgeschichte

Das Entscheidungsproblem

Gullivers Reise nach Laputa
1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in
der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle
¨
mogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htm
Art of the state

10 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Hilbertsche Programm

Art of the state

11 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.

Art of the state

11 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.

Art of the state

11 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.
Sondern alle mathematischen Wahrheiten ließen sich mit finiten
Methoden aus endlichen Axiomen und Regeln formal
schematisch ableiten.

Art of the state

11 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Hilbertsche Programm
Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen,
¨
die Mathematik auf eine axiomatische Basis zu stellen.
In diesem Refactoring entstand die Vorstellung, der Fortschritt in
der Mathematik sei nicht so sehr von den Anwendungen
getrieben.
Sondern alle mathematischen Wahrheiten ließen sich mit finiten
Methoden aus endlichen Axiomen und Regeln formal
schematisch ableiten.
¨
David Hilberts Ziel waren vollstandige und widerspruchsfreie
endliche Axiomenysteme fur alle mathematischen Theorien.
¨

Art of the state

11 / 98
Vorgeschichte

Das Entscheidungsproblem

¨
¨
¨
Die Godelschen Unvollstandigkeitssatze

Art of the state

12 / 98
Vorgeschichte

Das Entscheidungsproblem

¨
¨
¨
Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨

Art of the state

12 / 98
Vorgeschichte

Das Entscheidungsproblem

¨
¨
¨
Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨
¨
Kurt Godel konnte zeigen, dass formale Systeme nach Art der
¨
Arithmetik weder vollstandig sind, noch dass sich deren
¨
Widerspruchsfreiheit zeigen lasst.

Art of the state

12 / 98
Vorgeschichte

Das Entscheidungsproblem

¨
¨
¨
Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit
¨
¨
¨
den Godelschen Unvollstandigkeitssatzen einen schweren
Ruckschlag.
¨
¨
Kurt Godel konnte zeigen, dass formale Systeme nach Art der
¨
Arithmetik weder vollstandig sind, noch dass sich deren
¨
Widerspruchsfreiheit zeigen lasst.
¨
Formal lasst sich mathematische Wahrheit nur unzureichend
erfassen.

Art of the state

12 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Entscheidungsproblem

Art of the state

13 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit
dem fur eine beliebige, im formalen System der Arithmetik
¨
formulierte Aussage entschieden werden kann, ob sie
mathematisch wahr ist.

Art of the state

13 / 98
Vorgeschichte

Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit
dem fur eine beliebige, im formalen System der Arithmetik
¨
formulierte Aussage entschieden werden kann, ob sie
mathematisch wahr ist.
¨
1936 wurden bei zwei Zeitschriften unabhangig Arbeiten
eingereicht, die zeigten, dass es in der Arithmetik nicht
entscheidbare Probleme gibt. Diese Arbeiten legten nebenbei
¨
Grundlagen fur die spater entstehende Informatik.
¨

Art of the state

13 / 98
Vorgeschichte

Das Entscheidungsproblem

Literatur
Alonzo Church.
An unsolvable problem of elementary number theory.
American Journal of Mathematics, 58(2):345–363, April 1936.
Church fuhrte mit dem λ-Kalkul Grundlagen der funktionalen
¨
¨
Programmierung ein.

Alan M. Turing.
On computable numbers, with an application to the
Entscheidungsproblem.
Proceedings of the London Mathematical Society, 42:230–265,
1936.
Turing fuhrte die Universelle Turing-Machine ein und zeigte, dass das
¨
¨
Halteproblem unlosbar ist.

Art of the state

14 / 98
Vorgeschichte

Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state

15 / 98
Vorgeschichte

Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.

Art of the state

16 / 98
Vorgeschichte

Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt.

Art of the state

16 / 98
Vorgeschichte

Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt. Es ist:
(a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i)
gerade so viel, wie einmal von vorne nach hinten gekringelt.

Art of the state

16 / 98
Vorgeschichte

Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld
Die hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.
Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die
Klammern setzt. Es ist:
(a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i)
gerade so viel, wie einmal von vorne nach hinten gekringelt.
Das war jetzt nur ein Beispiel!
Art of the state

16 / 98
Funktionale Programmierung

Funktionale Programmierung

Art of the state

17 / 98
Funktionale Programmierung

Einfuhrung
¨

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

18 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.
ohne unerwunschte Seiteneffekte interagieren.
¨

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

Motivation
Die Bausteine der Programmierung sollten:
einfachste Bausteine sein.
sich erwartungskonform, reproduzierbar, berechenbar verhalten.
nach dem Vorbild von Lego kombinierbar sein.
immer neue Abstraktionen erlauben.
ohne unerwunschte Seiteneffekte interagieren.
¨

Idee . . .
¨
Vielleicht hilft mathematischer Mortel?

Art of the state

19 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.

Stop
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

¨
Hallo schone neue Welt
¨
In der funktionalen Programmierung sind Werte unveranderlich und
Funktionen keine Subroutinen, sondern mathematische Funktionen.
Es gibt keine Wertzuweisung. Variable sind nach Initialisierung
¨
unveranderlich.
Funktionen sind frei von Seiteneffekten.

Stop
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

Weiter
¨
¨
Wir lassen das Ratsel vorerst ungelost . . .

Art of the state

20 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Name
Λ-Kalkul
¨
Lisp
ML
Scheme
Common Lisp
Erlang
Haskell
OCaml
Scala
F#
Clojure

Einige funktionale Sprachen
Jahr
Autor
1936
Alonzo Church
1958
John McCarthy
1973
Robert Milner
1975
Steele / Sussman
1984
Komitee
1986 Ericsson, Joe Armstrong
1990
Komitee
1996
INRIA
2003
Martin Odersky
2005
Microsoft, Don Syme
2007
Rich Hickey

Art of the state

Typisierung
dynamisch
statisch
dynamisch
dynamisch
dynamisch
statisch
statisch, OO
statisch, OO
statisch, OO
dynamisch

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Name
Λ-Kalkul
¨
Lisp
ML
Scheme
Common Lisp
Erlang
Haskell
OCaml
Scala
F#
Clojure

Einige funktionale Sprachen
Jahr
Autor
1936
Alonzo Church
1958
John McCarthy
1973
Robert Milner
1975
Steele / Sussman
1984
Komitee
1986 Ericsson, Joe Armstrong
1990
Komitee
1996
INRIA
2003
Martin Odersky
2005
Microsoft, Don Syme
2007
Rich Hickey

Art of the state

Typisierung
dynamisch
statisch
dynamisch
dynamisch
dynamisch
statisch
statisch, OO
statisch, OO
statisch, OO
dynamisch

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Name
Λ-Kalkul
¨
Lisp
ML
Scheme
Common Lisp
Erlang
Haskell
OCaml
Scala
F#
Clojure

Einige funktionale Sprachen
Jahr
Autor
1936
Alonzo Church
1958
John McCarthy
1973
Robert Milner
1975
Steele / Sussman
1984
Komitee
1986 Ericsson, Joe Armstrong
1990
Komitee
1996
INRIA
2003
Martin Odersky
2005
Microsoft, Don Syme
2007
Rich Hickey

Art of the state

Typisierung
dynamisch
statisch
dynamisch
dynamisch
dynamisch
statisch
statisch, OO
statisch, OO
statisch, OO
dynamisch

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Name
Λ-Kalkul
¨
Lisp
ML
Scheme
Common Lisp
Erlang
Haskell
OCaml
Scala
F#
Clojure

Einige funktionale Sprachen
Jahr
Autor
1936
Alonzo Church
1958
John McCarthy
1973
Robert Milner
1975
Steele / Sussman
1984
Komitee
1986 Ericsson, Joe Armstrong
1990
Komitee
1996
INRIA
2003
Martin Odersky
2005
Microsoft, Don Syme
2007
Rich Hickey

Art of the state

Typisierung
dynamisch
statisch
dynamisch
dynamisch
dynamisch
statisch
statisch, OO
statisch, OO
statisch, OO
dynamisch

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Name
Λ-Kalkul
¨
Lisp
ML
Scheme
Common Lisp
Erlang
Haskell
OCaml
Scala
F#
Clojure

Einige funktionale Sprachen
Jahr
Autor
1936
Alonzo Church
1958
John McCarthy
1973
Robert Milner
1975
Steele / Sussman
1984
Komitee
1986 Ericsson, Joe Armstrong
1990
Komitee
1996
INRIA
2003
Martin Odersky
2005
Microsoft, Don Syme
2007
Rich Hickey

Art of the state

Typisierung
dynamisch
statisch
dynamisch
dynamisch
dynamisch
statisch
statisch, OO
statisch, OO
statisch, OO
dynamisch

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Geschichte
Einige funktionale Sprachen
Name Jahr
Autor Typisierung
Λ-Kalkul 1936
Alonzo Church
¨
Lisp 1958
John McCarthy
dynamisch
ML 1973
Robert Milner
statisch
Scheme 1975
Steele / Sussman
dynamisch
Common Lisp 1984
Komitee
dynamisch
Erlang 1986 Ericsson, Joe Armstrong
dynamisch
Haskell 1990
Komitee
statisch
OCaml 1996
INRIA statisch, OO
Scala 2003
Martin Odersky statisch, OO
F# 2005
Microsoft, Don Syme statisch, OO
Clojure 2007
Rich Hickey
dynamisch
Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2
¨
2

Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.
Art of the state

21 / 98
Funktionale Programmierung

Einfuhrung
¨

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.

Art of the state

22 / 98
Funktionale Programmierung

Einfuhrung
¨

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().

Art of the state

22 / 98
Funktionale Programmierung

Einfuhrung
¨

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.

Art of the state

22 / 98
Funktionale Programmierung

Einfuhrung
¨

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.
Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu
¨
Einzeilern zusammenzuschieben.

Art of the state

22 / 98
Funktionale Programmierung

Einfuhrung
¨

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert
¨
¨
ausschließlich von den Argumenten abhangt und ohne
Seiteneffekte berechnet wird.
Beispiel: sum(), max(), size().
Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,
wenn er durch seinen Wert ersetzt werden kann, ohne
¨
das Verhalten des Programms zu verandern.
Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu
¨
Einzeilern zusammenzuschieben.
Das ist nicht immer eine gute Idee.

Art of the state

22 / 98
Funktionale Programmierung

Fraktales SQL

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

23 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Obfuscated Query contest

In den Nesseln eines fraktalen Ungeheuers?

¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.

WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)

Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx

24 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Obfuscated Query contest

In den Nesseln eines fraktalen Ungeheuers?

¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.
Doch werden
keine Werte
¨
verandert.

WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)

Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx

24 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Obfuscated Query contest

In den Nesseln eines fraktalen Ungeheuers?

¨
Selects konnen
uberall Selects
¨
enthalten und es
sind nur Einzeiler
¨
moglich.
Doch werden
keine Werte
¨
verandert.
Und Funktionen
haben keine
Seiteneffekte.

WITH LatestOrders (ID) AS (SELECT MAX(ID)
FROM dbo.Orders GROUP BY CustomerID)
SELECT
Customers.∗,
Orders.OrderTime AS LatestOrderTime,
(SELECT COUNT(∗) FROM dbo.OrderItems
WHERE OrderID IN
(SELECT ID FROM dbo.Orders WHERE
CustomerID = Customers.ID))
AS TotalItemsPurchased
FROM
dbo.Customers INNER JOIN dbo.Orders
ON Customers.ID = Orders.CustomerID
WHERE
Orders.ID IN (SELECT ID FROM LatestOrders)

Art of the state
www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx

24 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Nicht das schrecklichste Ungeheuer der Meere

http://commons.wikimedia.org/wiki/File:Millepora_fire_coral.JPG
Art of the state

25 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:

Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.

Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.

Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.

Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.
¨
Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Fraktales SQL
Fazit

¨
Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum
¨
Entflechten waren wunschenswert. Doch die Vorteile des funktionalen
¨
Designs sind sichtbar:
Aufgrund des funktionalen Aufbaus sind verschachtelte Selects
wartbarer als etwa C-Einzeiler.
Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen
¨
als Stored Procedures ist moglich.
Zwischen lesenden und schreibenden Zugriffen in SQL besteht
eine klare Trennung.
¨
Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3

und gelegentlich auch in Inserts
Art of the state

26 / 98
Funktionale Programmierung

Fraktales SQL

Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.

Art of the state

27 / 98
Funktionale Programmierung

Fraktales SQL

Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.

Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨

Art of the state

27 / 98
Funktionale Programmierung

Fraktales SQL

Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.

Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨

Antwort
¨
Aus der Verwendung unveranderlicher Bausteine entstehen ganz
¨
neue Moglichkeiten der Wiederverwendung.

Art of the state

27 / 98
Funktionale Programmierung

Fraktales SQL

Persistente Datenstrukturen
¨
Bausteine der Funktionalen Programmierung sind unveranderliche
Datenstrukturen.

Frage
Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder
¨
Anderung eine neue Collection anlegen zu mussen?
¨

Antwort
¨
Aus der Verwendung unveranderlicher Bausteine entstehen ganz
¨
neue Moglichkeiten der Wiederverwendung.
Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zu
¨
tun. Persistente Datenstrukturen erhalten bei Anderungen
die vorherige Version, speichern jeweils nur die Differenz
¨
und sind damit im Effekt unveranderlich.
Art of the state

27 / 98
Funktionale Programmierung

Fraktales SQL

Eine persistente Datenstruktur aus dem Jahr 2000 4
public class FullIntList extends IntList {
private int sz;
private Object val ;
private IntList next;
public FullIntList (Object x) {
sz = 1; val = x; next = new EmptyIntlist() ; }
public Object first () { return val ; }
public Object rest () { return next; }
public IntList addEl(Object x) {
FullIntList n = new FullIntList(x);
n.next = this;
n.sz = this .sz + 1;
return n; }
}
4
Figure 7.1.3 aus Barbara Liskov with John Guttag: Program Development in Java :
Abstraction, Specification, and Object-Oriented Design. 1. Aufl.. 2000.
Art of the state

28 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

29 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨

5

¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state

30 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨
Die Stimmen der Parteien werden durch eine Folge von Divisoren
¨
geteilt. Die Sitze werden in der Reihenfolge der großten sich
5
¨
ergebenen Hochstzahlen zugeteilt.

5

¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state

30 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
¨
d’hondtsches Hochstzahlverfahren

Das Verfahren nach d’Hondt ist bei den Landtagswahlen in
Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein
maßgeblich fur die Sitzzuteilung (Zweitstimmen).
¨
Die Stimmen der Parteien werden durch eine Folge von Divisoren
¨
geteilt. Die Sitze werden in der Reihenfolge der großten sich
5
¨
ergebenen Hochstzahlen zugeteilt.
Den Sonderfall Stimmengleichheit beim letzten Sitz
¨
vernachlassigen wir.

5

¨
Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/
de/glossar/texte/d_Hondtsche_Sitzverteilung.html
Art of the state

30 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
10000
6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000
6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000
3000
750
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000
3000
750
4.
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
6.
2500
1500
375
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333
2000
500
6.
2500
1500
375
7.
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
1500
3.
5000 5. 3000
750
4.
3333 8. 2000
500
6.
2500
1500
375
7.
2000
1200
300
1667
1000
250
1429
857
214
1250
750
188

Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
3.
5000 5. 3000
4.
3333 8. 2000
6.
2500
7.
2000

5

3

Art of the state

0

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Am Wahlabend

Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen
vorliegen.
Teiler
1
2
3
4
5
6
7
8
Sitze

Zuteilung von 8 Sitzen
Partei A
Partei B Partei C
1. 10000 2. 6000
3.
5000 5. 3000
4.
3333 8. 2000
6.
2500
7.
2000

5

3

0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalen
Programmierstudio.
Art of the state

31 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Schritt fur Schritt
¨

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.

Art of the state

32 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Schritt fur Schritt
¨

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].

Art of the state

32 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Schritt fur Schritt
¨

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]

Art of the state

32 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Schritt fur Schritt
¨

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]

Bilde daraus die Liste plazierung, die von jedem Paar nur die
¨
Partei-Komponente enthalt [A, B, A, A, B, A, B, A]

Art of the state

32 / 98
Funktionale Programmierung

Eine funktionale Berechnung

Eine funktionale Berechnung
Schritt fur Schritt
¨

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:
[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu
vergeben.
Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum
i
und i aus 1, 2, ..sitze:
[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].
Sortiere quotienten absteigend nach der zweiten Komponente und
nehme die ersten sitze Paare in eine neue Liste auf:
[(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)]

Bilde daraus die Liste plazierung, die von jedem Paar nur die
¨
Partei-Komponente enthalt [A, B, A, A, B, A, B, A]
Filtere nach den einzelnen Parteien. Jedes der Filtrate
[A, A, A, A, A], [B, B, B] und [] ist dann eine sitzliste. Partei A
¨
¨
erhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.
Art of the state

32 / 98
Funktionale Programmierung

Konzepte und Programme

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

33 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,
eine Funktion in einer Datenstruktur gespeichert werden,

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

First-Class Functions
¨
Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder
Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen,
¨
in denen Funktionen first class citizen sind. In diesen Sprachen kann
eine Funktion einer anderen Funktion als Argument ubergeben
¨
werden,
eine Funktion eine andere Funktion als Ruckgabewert haben,
¨
eine Funktion einer Variablen zugewiesen werden,
eine Funktion in einer Datenstruktur gespeichert werden,
eine Funktion zur Laufzeit erzeugt werden.

Art of the state

34 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
¨
Erklarung und Beispiele

¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.

Art of the state

35 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
¨
Erklarung und Beispiele

¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨

So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state

35 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
¨
Erklarung und Beispiele

¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.

So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state

35 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
¨
Erklarung und Beispiele

¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.
filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch
¨
die Elemente von seq enthalt, fur die die boolesche
¨
Funktion test zutrifft.

So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state

35 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
¨
Erklarung und Beispiele

¨
Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als
¨
Argumente erhalt oder Funktionen als Ergebnis liefert.
compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x.
¨
map map(f, seq) erstellt eine neue Sequenz durch Anwendung
der Funktion f auf alle Elemente von seq.
filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch
¨
die Elemente von seq enthalt, fur die die boolesche
¨
Funktion test zutrifft.
¨
reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufend
auf eine Sequenz an und liefert einen einzelnen Wert
zuruck.
¨
So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4],
f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.
Art of the state

35 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
Weitere Beispiele

In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:

6

Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state

36 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
Weitere Beispiele

In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:
<html><head><meta charset="UTF-8"></head>
<body><script src = "higher-order.js" type="text/javascript">
</script></body></html>

6

Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state

36 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
Weitere Beispiele

In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an:
<html><head><meta charset="UTF-8"></head>
<body><script src = "higher-order.js" type="text/javascript">
</script></body></html>

¨
Zur Vertiefung empfehle ich dieses schone Buch6
http://eloquentjavascript.net/chapter6.html

6

Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.
1. Aufl.. No Starch Press, 2011.
Art of the state

36 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
im Einsatz

var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333],
[’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]]
// erste Komponente, z.B. ’A’ fur first ([’ A’, 10000])
¨
function first (a) {return a[0]}
// eq(a) gibt Funktion zuruck, die Gleichheit mit a prueft
¨
function eq(a){
return function (b){return a == b}
}
// map(first ) −> [ABAABABA], filter(eq(A)) −> [AAAAA]
function sitzliste ( partei ) {
return plazierung.map(first ) . filter (eq(partei) )
}
// length [AAAAA] = 5
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}
Art of the state

37 / 98
Funktionale Programmierung

Konzepte und Programme

Higher Order Functions
Comprehensions

Statt map und filter werden gerne List Comprehensions genommen.
¨
Als Bonus erhalt man noch ein ein einfaches Pattern Matching.
list-comprehension.js
var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333],
[’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]]
function sitzliste ( partei ) {
return [p for each([p, q] in plazierung) if (p == partei) ]
}
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}

Art of the state

38 / 98
Funktionale Programmierung

Konzepte und Programme

Das Wahlprogramm
/∗∗ script type =”application / javascript ;version=1.7 ∗∗/
function range(begin, end){
for ( let i = begin; i < end; ++i){yield i ;}}
var sitze = 8, votum = [[’A’, 10000], [’C’, 1500], [’B’, 6000]];
var plazierung =
[[ p, v/ i ] for ( i in range(1, sitze +1)) for each ([p, v] in votum)]
. sort ( function (a, b){return b[1] − a[1]}) . slice (0, sitze ) ;
function sitzliste ( partei ) {
return [p for each([p, q] in plazierung) if (p == partei) ]
}
for each (var p in [’A’, ’B’, ’C’]) {
document.write(p + ’:’ + sitzliste (p).length+ ’ ’)
}
Art of the state

39 / 98
Funktionale Programmierung

Konzepte und Programme

Lazy Evaluation
Generator Expressions in JavaScript 1.8 erlauben Lazy Evaluation.
/∗∗ script type =”application / javascript ;version=1.8 ∗∗/
// ALLE natuerlichen Zahlen
function nat() {
var i = 0;
while (true) {
yield i ;
i +=1;
}
}
// ALLE Zahlen , deren Quadrate groesser als 1000 sind
var q1000 = (i for each (i in nat() ) if ( i ∗i > 1000));
// Die erste Zahl, deren Quadrat groesser als 1000 ist, ist 32
document.write(q1000.next())
Art of the state

40 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Seiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great
Good von Miran Lipovaˇ a7 und ist auch online verfugbar.
c
¨
http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

7

Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.
c
Aufl.. No Starch Press, 2011.
Art of the state

41 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Seiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great
Good von Miran Lipovaˇ a7 und ist auch online verfugbar.
c
¨
http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

Das Buch ist unbedingt empfehlenswert.
7

Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.
c
Aufl.. No Starch Press, 2011.
Art of the state

41 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Art of the state

42 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.

Art of the state

42 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.

¨
Vogel auf der
Balancierstange!

Art of the state

42 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.

¨
Vogel auf der
Balancierstange!

¨
¨
Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre
¨
ins Netz. Der Unterschied darf hochstens drei sein.

Art of the state

42 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

¨
Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu
¨
kampfen.

¨
Vogel auf der
Balancierstange!

¨
¨
Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre
¨
ins Netz. Der Unterschied darf hochstens drei sein.
Ein Haskell-Programm soll nach erfolgreichem Seilgang den
Vogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.
¨
Art of the state

42 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Art of the state

43 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.

Art of the state

43 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3

Art of the state

43 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3

Ein Vogel landet links, vier landen rechts, zwei links, noch einer links.
Art of the state

43 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
¨
Vogel auf der Balancierstange

Haskell kennt keine Exceptions, eine pure Function soll sich nicht
durch Seiteneffekte aus der Ruhe bringen lassen.
Pierre1.hs
routine :: Maybe Pole
routine = case landLeft 1 (0,0) of
Nothing −> Nothing
Just pole1 −> case landRight 4 pole1 of
Nothing −> Nothing
Just pole2 −> case landLeft 2 pole2 of
Nothing −> Nothing
Just pole3 −> landLeft 1 pole3

Ein Vogel landet links, vier landen rechts, zwei links, noch einer links.
¨
Schon bekommt das Programm einen leichten Seitwartsdrall.
Art of the state

43 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell

Art of the state

44 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell

Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.
Pierre2.hs
routine2 :: Maybe Pole
routine2 = do
start <− return (0, 0)
pole0 <− landLeft 1 start
pole1 <− landRight 4 pole0
pole2 <− landLeft 2 pole1
landLeft 1 pole2

Art of the state

44 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
Kontrollierter Umgang mit Seiteneffekten in Haskell

Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.
Pierre2.hs
routine2 :: Maybe Pole
routine2 = do
start <− return (0, 0)
pole0 <− landLeft 1 start
pole1 <− landRight 4 pole0
pole2 <− landLeft 2 pole1
landLeft 1 pole2

Pierre3.hs
routine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2
>>= landLeft 1

Art of the state

44 / 98
Funktionale Programmierung

Konzepte und Programme

Das programmierbare Semikolon
Was war jetzt der Trick mit der Banane?

type Birds = Int
type Pole = (Birds, Birds)
landLeft :: Birds −> Pole −> Maybe Pole
landLeft n ( left , right )
| abs (( left + n) − right ) < 4 = Just ( left + n, right )
| otherwise
= Nothing
landRight :: Birds −> Pole −> Maybe Pole
landRight n ( left , right )
| abs ( left − ( right + n)) < 4 = Just ( left , right + n)
| otherwise
= Nothing
banana :: Pole −> Maybe Pole
banana = Nothing
Art of the state

45 / 98
Funktionale Programmierung

Konzepte und Programme

Die Antwort auf eine andere offene Frage

Art of the state

46 / 98
Funktionale Programmierung

Konzepte und Programme

Die Antwort auf eine andere offene Frage

Frage
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

Art of the state

46 / 98
Funktionale Programmierung

Konzepte und Programme

Die Antwort auf eine andere offene Frage

Frage
Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

Antwort
Das geht nicht, aber die funktionale Programmierung verfugt uber
¨ ¨
Mittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state

46 / 98
Funktionale Programmierung

Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state

47 / 98
Funktionale Programmierung

Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule

HuHu

Na, habt ihrs rausgefunden?

Art of the state

48 / 98
Funktionale Programmierung

Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule

HuHu

Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨

Art of the state

48 / 98
Funktionale Programmierung

Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule

HuHu

Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨
¨
Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge
¨
zusammenheften.

Art of the state

48 / 98
Funktionale Programmierung

Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld
Die schlaue Eule

HuHu

Na, habt ihrs rausgefunden?
Richtig, jede Reihe kann einen eigenen Zettel ausfullen.
¨
¨
Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge
¨
zusammenheften.
¨
Nachstes Mal!

Art of the state

48 / 98
Lambda Expressions in Java 8

Lambda Expressions in Java 8

Art of the state

49 / 98
Lambda Expressions in Java 8

Motivation

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

50 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Art of the state

51 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Art of the state

51 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iteration
int sum = 0;
for (Wahlkreis wk : wahlkreise) {
if ( partei .equals(wk.partei)) {
sum += wk.stimmen;
}
}

Art of the state

51 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Interne Iteration
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Externe Iteration
int sum = 0;
for (Wahlkreis wk : wahlkreise) {
if ( partei .equals(wk.partei)) {
sum += wk.stimmen;
}
}

Frage
Wo ist hier noch Spielraum?
Art of the state

51 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨

Art of the state

52 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)

Art of the state

52 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)

Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨

Art of the state

52 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)

Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨

¨
Problem Kompatibilitat
¨
Man kann nicht so ohne weiteres die Libraries andern.

Art of the state

52 / 98
Lambda Expressions in Java 8

Motivation

Probleme mit den Collections
Bibliotheken brauchen Spielraum fur Parallelisierung
¨

Collections sind ein idealer Kandidat fur parallele Verarbeitung.
¨
¨
Logik gehort in die Library (vgl. SQL)

Problem externe Iteration
Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung.
¨

¨
Problem Kompatibilitat
¨
Man kann nicht so ohne weiteres die Libraries andern.

¨
Losung
Java Language Architect Brian Goetz und sein Team haben daher die
¨
Sprache Java geandert.
Art of the state

52 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

53 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013

Art of the state

54 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013

java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}

Art of the state

54 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013

java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}

java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}

Art of the state

54 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013

java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}

java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}
Aha, polymorphe Default Implemetierung in Interfaces und . . .

Art of the state

54 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

¨
Abwartskompatibler Warp-Antrieb
lambda-8-b117 vom 21.11.2013

java/util/Collection.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , 0);
}

java/util/List.java
@Override
default Spliterator <E> spliterator() {
return Spliterators . spliterator ( this , Spliterator .ORDERED);
}
Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR
Art of the state

54 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Disclaimer
Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu
¨
¨
klaren, andere konnen das besser. Insbesondere verweise ich auf
¨
Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von
Brian Goetz und Maurice Naftalin:
http://openjdk.java.net/projects/lambda/
http://www.lambdafaq.org/
http://naftalin.org/maurice/professional/talks/
cAfter8_devoxx2012.pdf
https://blogs.oracle.com/briangoetz/resource/
devoxx-lang-lib-vm-co-evol.pdf

Art of the state

55 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Disclaimer
Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu
¨
¨
klaren, andere konnen das besser. Insbesondere verweise ich auf
¨
Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von
Brian Goetz und Maurice Naftalin:
http://openjdk.java.net/projects/lambda/
http://www.lambdafaq.org/
http://naftalin.org/maurice/professional/talks/
cAfter8_devoxx2012.pdf
https://blogs.oracle.com/briangoetz/resource/
devoxx-lang-lib-vm-co-evol.pdf
Aber was ist jetzt mit diesen Streams?

Art of the state

55 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream in Action

Art of the state

56 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream in Action

Parametrisierung mit anonymen Klassen
int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) {
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8
}
};
ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum();
}

Art of the state

56 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream in Action

Parametrisierung mit anonymen Klassen
int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) {
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8
}
};
ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum();
}
8
Cannot refer to a non-final variable partei inside an inner class defined in a
different method
Art of the state

56 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
in Java

Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.

Art of the state

57 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
in Java

Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.

Art of the state

57 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
in Java

Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.

Art of the state

57 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
in Java

Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.
Anonyme Klassen sind jedoch absolute Holzklasse.

Art of the state

57 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
in Java

Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp.
Java Funktionen sind keine First-Class Funktionen.
Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order
¨
Functions moglich.
Anonyme Klassen sind jedoch absolute Holzklasse.
Wir werden bald was besseres haben . . .

Art of the state

57 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.

Art of the state

58 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.

Art of the state

58 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.

Art of the state

58 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.

Art of the state

58 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.
Bei der Parallelverarbeitung verdoppelt sich der Stream durch
Zellteilung (FORK ).

Art of the state

58 / 98
Lambda Expressions in Java 8

Collections und Higher-Order Functions

Higher-Order Functions
Stream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wir
mit Verhalten parametrisieren.
Manche Higher-Order Functions wie map und filter sind lazy und
¨
werden zunachst nur in die Verarbeitungs-Queue aufgenommen.
Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu
¨
zwingende eager Higher Order Funktion wie reduce kommt, die
¨
¨
naturgemaß am Ende steht und die Verarbeitung auslost.
Ein Stream wird von einer Collection mit stream() oder
¨
parallelStream() ausgelost.
Bei der Parallelverarbeitung verdoppelt sich der Stream durch
Zellteilung (FORK ).
Die Arbeitsergebnisse werden in der richtigen Reihenfolge
zusammengetragen (JOIN).
Art of the state

58 / 98
Lambda Expressions in Java 8

Closures

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

59 / 98
Lambda Expressions in Java 8

Closures

Closures
Definition

Art of the state

60 / 98
Lambda Expressions in Java 8

Closures

Closures
Definition

Anonyme Funktionen wurden 1936 von Alonzo Church mit dem
Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann
¨
¨
definiert und aufgerufen werden, ohne an einen Identifier
gebunden zu sein.

Art of the state

60 / 98
Lambda Expressions in Java 8

Closures

Closures
Definition

Anonyme Funktionen wurden 1936 von Alonzo Church mit dem
Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann
¨
¨
definiert und aufgerufen werden, ohne an einen Identifier
gebunden zu sein.
Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closure
¨
ist eine anonyme Funktion, die nicht nur Zugriff auf ihren
unmittelbaren lexical scope hat, sondern auch auf das
lexical environment, aus dem sie aufgerufen wird. Ihre
freien Variablen werden in dem aufrufenden Kontext
gebunden (closed). Daher der Name Closure.

Art of the state

60 / 98
Lambda Expressions in Java 8

Closures

Closures
in Programmiersprachen

Die ersten Programmiersprachen mit Closures
Name

Jahr

Autor

Typisierung

Paradigma

Smalltalk

1972

Alan Kay, Dan Ingalls
und Adele Goldberg

dynamisch

objektorientiert

Scheme

1975

Guy L. Steele und
Gerald Jay Sussman

dynamisch

funktional

Art of the state

61 / 98
Lambda Expressions in Java 8

Closures

Closures
in Programmiersprachen

Die ersten Programmiersprachen mit Closures
Name

Jahr

Autor

Typisierung

Paradigma

Smalltalk

1972

Alan Kay, Dan Ingalls
und Adele Goldberg

dynamisch

objektorientiert

Scheme

1975

Guy L. Steele und
Gerald Jay Sussman

dynamisch

funktional

Und seitdem in vielen, vielen anderen Sprachen . . .

Art of the state

61 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8

Art of the state

62 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Java: Closures mit anonymen Klassen
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei.equals(wk.partei) ;
}
};
ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
int sum = wahlkreise.stream()
. filter ( testPartei ) .map(mapStimm).sum();

Art of the state

62 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Java: Closures mit anonymen Klassen
Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){
public boolean test(Wahlkreis wk) {
return partei.equals(wk.partei) ;
}
};
ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() {
public int applyAsInt(Wahlkreis wk) {
return wk.stimmen;
}
};
int sum = wahlkreise.stream()
. filter ( testPartei ) .map(mapStimm).sum();

Java 8: Closures mit anonymen Funktionen
int sum = wahlkreise.stream()
. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();
Art of the state

62 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Funktionale Interfaces

Was haben diese Interfaces gemeinsam?
java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
Art of the state

63 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces

Art of the state

64 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces

Funktionale Interfaces deklarieren genau eine abstrakte Methode.

Art of the state

64 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
Anonyme Funktionen implementieren funktionale Interfaces

Funktionale Interfaces deklarieren genau eine abstrakte Methode.
Eine anonyme Funktion implementiert ein funktionales Interface.
Welches, das erschließt sich aus dem Kontext.
Typen mussen nicht immer angegeben werden. Der
¨
Java-Compiler lernt zunehmend Typ-Inferenz.

Art of the state

64 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨

Art of the state

65 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨

Anonyme Funktionen und anonyme Klassen haben Zugriff auf
effectively final Variablen des lexical environments.

Art of the state

65 / 98
Lambda Expressions in Java 8

Closures

Closures in Java 8
¨
¨
Anonyme Funktionen sind dunnhautige Chamaleons
¨

Anonyme Funktionen und anonyme Klassen haben Zugriff auf
effectively final Variablen des lexical environments.
Im Gegensatz zu anonymen Klassen haben anonyme Funktionen
¨
keine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,
sie bringen keinen eigenen Scope mit. Selbst das Schlusselwort
¨
this ist das this ihres lexical environments.

Art of the state

65 / 98
Lambda Expressions in Java 8

Closures

¨
Zum Aufwarmen
lambda-8-b117 vom 21.11.2013

import java. util .∗;
import java. util . function .∗;
import static java. util .stream.Collectors. toList ;
List <String> worte = Arrays.asList("Wo", "ist", "meine", "Brille");
// Ausgabe [meine, Brille]
show(worte.stream(). filter (p −> p.length() > 3). collect ( toList () ) ) ;
// Ausgabe jedesmal [2, 3, 5, 6]
Function<String, Integer> f1 = p −> p.length(); // closure
Function<String, Integer> f2 = String :: length; // method reference
show(worte.stream().map(f1).collect( toList () ) ) ;
show(worte.stream().map(f2).collect( toList () ) ) ;
List <Integer> zahlen = Arrays.asList(6, 5, 2, 3);
zahlen.sort (( p1, p2) −> p1.compareTo(p2));
show(zahlen);
Art of the state

66 / 98
Lambda Expressions in Java 8

Closures

Spielraum fur Parallelisierung
¨

Interne Iteration mit SQL
SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’

Interne Iteration mit Java 8
int sum =wahlkreise.parallelStream()
. filter (wk−>"A".equals(wk.partei))
. mapToInt (wk−>wk.stimmen)
. sum();

Art of the state

67 / 98
Lambda Expressions in Java 8

Closures

Abfragen zur Wahl . . .
lambda-8-b117 vom 21.11.2013

import java. util .∗;
import java. util . function .∗;
import java. util .stream.Collectors;
List <Pair> quotienten = new ArrayList<>();
for ( int i = 1; i <= anzSitze; ++i) {
for (Pair v : votum) {
quotienten.add(new Pair(v.partei, v.zahl/ i ) ) ;
}
}
// quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ...
List <String> plazierung = quotienten.stream()
.sorted((p1, p2) −> p2.zahl − p1.zahl).limit (anzSitze)
.map(pair −> pair.partei)
. collect (Collectors . toList () ) ;
// plazierung = [A, B, A, A, B, A, B, A]
Art of the state

68 / 98
Lambda Expressions in Java 8

Closures

Abfragen zur Wahl im LINQ Stil
lambda-8-b117 vom 21.11.2013

import
import
import
import

java. util .∗;
java. util . function .∗;
java. util .stream.Collectors;
static java. util .stream.Collectors.groupingBy;
// quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ...
Map<String, List<String>> parteiSitze = quotienten.stream()
.sorted((p1, p2) −> p2.zahl − p1.zahl)
. limit (anzSitze).map(pair −> pair.partei)
. collect (groupingBy(a−>a));
// parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]}

Art of the state

69 / 98
Lambda Expressions in Java 8

Closures

Codeblock in Action
lambda-8-b117 vom 21.11.2013

Fur Smalltalk und Ruby-Fans.
¨
// parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]}
parteiSitze .entrySet() .stream().
forEach(e−>{
System.out.print(e.getKey()+":"+e.getValue().size()+" ");
}) ;
// A:5 B:3

Art of the state

70 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state

71 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

Art of the state

72 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHuHu

Art of the state

73 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL

Hu

Bielefeld ist in Existenznot und braucht meine Hilfe.

Art of the state

74 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL

Hu

Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.

Art of the state

74 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL

Hu

Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
Spliterator geht nicht,

Art of the state

74 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL

Hu

Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
¨
Spliterator geht nicht, zu wenig Assoziativitat.

Art of the state

74 / 98
Lambda Expressions in Java 8

Closures

Die FunctionalOWL vom Hackerspace Bielefeld
Die FunctionalOWL

Hu

Bielefeld ist in Existenznot und braucht meine Hilfe.
Ich muss sofort zum Hackerspace.
¨
Spliterator geht nicht, zu wenig Assoziativitat.
Wenn nur das Lambdagate noch offen ist . . .

Art of the state

74 / 98
Funktionale Software-Architektur und Java

Funktionale
Software-Architektur und Java

Art of the state

75 / 98
Funktionale Software-Architektur und Java

Motivation

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

76 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?

Aber
¨
sind nicht veranderliche Objekte ein Grundmerkmal der
Objektorientierung?

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Motivation
¨
Ware es nicht einfacher, . . .
¨
¨
Software zu warten, bei der man nicht regelmaßig mit argerlichen
¨
Seiteneffekten zu kampfen hat,
Software zu testen, die nur von ihren Eingabeparametern
¨
abhangig ist,
¨
mit unveranderlichen Bausteinen zu arbeiten?

Aber
¨
sind nicht veranderliche Objekte ein Grundmerkmal der
Objektorientierung?

Antwort
Hmm, . . .

Art of the state

77 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state

Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.

Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.

Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.

Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.
¨
¨
Losungsansatze kommen aus der funktionalen Programmierung9 .

Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit shared mutable state
Multicore Prozessor Architekturen verlangen neue
¨
Programmieransatze.
Unsynchronisierte Threads fuhren zu nichtdeterministischen
¨
¨
Programmablaufen.
Von mehreren Threads gemeinsam genutzte Daten und
¨
Ressourcen sollten unveranderlich sein, denn Synchronisation ist
¨
kompliziert und fehleranfallig.
¨
¨
Losungsansatze kommen aus der funktionalen Programmierung9 .
Dieses hervorragende Buch von Venkat
¨
Subramaniam zeigt Losungen mit Java, Groovy,
Scala und Clojure.
9

Subramaniam, Venkat: Programming Concurrency on the JVM.
Art of the state

78 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.
Sie sind ein Zeichen mangelnder Modellierung und fehlender oder
falscher Abstraktion.

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Probleme mit global mutable state
StateExplosion.java
public static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das
Gegenteil von Design.
Aber auch in realen Projekten finden sich oft unwartbare globale
Allzweck-Datenstrukturen.
Sie sind ein Zeichen mangelnder Modellierung und fehlender oder
falscher Abstraktion.

Der Blick durch funktionale und OO Brille. . .
helfen, maßgeschneiderte Abstraktionen zu finden.

Art of the state

79 / 98
Funktionale Software-Architektur und Java

Motivation

Motivationsschub

Art of the state

80 / 98
Funktionale Software-Architektur und Java

Motivation

Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}

Art of the state

80 / 98
Funktionale Software-Architektur und Java

Motivation

Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}

Diese Klasse ist threadsafe10 .

Art of the state

80 / 98
Funktionale Software-Architektur und Java

Motivation

Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}

Diese Klasse ist threadsafe10 .

10

Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug;
Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006.
Art of the state

80 / 98
Funktionale Software-Architektur und Java

Motivation

Motivationsschub
Immutable Point class . . .
@Immutable
public class Point {
public final int x, y;
public Point( int x, int y) {
this .x = x;
this .y = y;
}
}

Diese Klasse ist threadsafe10 .
¨
Alle unveranderlichen Klassen sind threadsafe.
10

Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug;
Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006.
Art of the state

80 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Gliederung
1

Vorgeschichte
Das Entscheidungsproblem

2

Funktionale Programmierung
Einfuhrung
¨
Fraktales SQL
Eine funktionale Berechnung
Konzepte und Programme

3

Lambda Expressions in Java 8
Motivation
Collections und Higher-Order Functions
Closures

4

Funktionale Software-Architektur und Java
Motivation
Trennung: Schwarz und Weiß
Trennung: Graustufen
Art of the state

81 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.

Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.

Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.
Nach einer kurzen Einfuhrung werfen wir einen Blick auf die
¨
¨
einschlagige Literatur.

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Thema
Wir werden hier nicht versuchen, Java zu funktionalisieren oder
Java 8 Features zu simulieren.
Es geht um idiomatisches, objektorientiertes Java, das auch
unsere Kollegen verstehen.

Der Blick durch die funktionale Brille . . .
¨
soll uns helfen, bessere und verstandlichere Programme zu schreiben.
Nach einer kurzen Einfuhrung werfen wir einen Blick auf die
¨
¨
einschlagige Literatur.
Danach geht es mit Fallstudien weiter.

Art of the state

82 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.
Auch aus der Vogelperspektive werden wir darauf beharren, dass
¨
unveranderliche Objekte unmittelbar nach Durchlaufen des
Konstruktors final sind.

Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
In der Architektur geht es ums Trennen, wir wollen keine
undifferenzierten Monolithen
Wir folgen dem Grundsatz, Logik zu zentralisieren.
¨
Wo wir konnen, werden wir im logischen Kern unserer Programme
¨
unveranderliche Objekte und pure Methoden verwenden.
Aus der architektonischen Vogelperspektive, versteht sich. An
¨
Log-Ausgaben und Exception-Handling werden wir nichts andern.
Auch aus der Vogelperspektive werden wir darauf beharren, dass
¨
unveranderliche Objekte unmittelbar nach Durchlaufen des
Konstruktors final sind.
Sollte Ergebnis der Trennung sein, dass z.B. eine extrem
¨
veranderliche Komponente, durch einen endlichen Automaten zu
realisieren ist, dann ist auch das eine gute Abgrenzung.
Art of the state

83 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
Literaturempfehlungen

Art of the state

84 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
Literaturempfehlungen

Art of the state

84 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
Literaturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.

Art of the state

84 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
Literaturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.
Program Development in Java ist ein Klassiker der
Informatikausbildung, jedoch kein Buch um Java zu lernen.

Art of the state

84 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß
Literaturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immer
dabei haben sollte.
Program Development in Java ist ein Klassiker der
Informatikausbildung, jedoch kein Buch um Java zu lernen.
Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.
¨
11

Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,
Testen und Techniken fur sauberen Code. mitp-Verlag, 2009
¨
Art of the state

84 / 98
Funktionale Software-Architektur und Java

Trennung: Schwarz und Weiß

Literaturstudium Effective Java

Art of the state

85 / 98
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java
Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Weitere ähnliche Inhalte

Andere mochten auch

Android User Interface
Android User InterfaceAndroid User Interface
Android User InterfaceDanny Fürniß
 
Android Entwicklung
Android EntwicklungAndroid Entwicklung
Android Entwicklungfranky1888
 
Android im Visier von Cyberkriminellen
Android im Visier von CyberkriminellenAndroid im Visier von Cyberkriminellen
Android im Visier von CyberkriminellenConnected-Blog
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und LambdasNane Kratzke
 

Andere mochten auch (6)

Java 8 Streams
Java 8 StreamsJava 8 Streams
Java 8 Streams
 
Android User Interface
Android User InterfaceAndroid User Interface
Android User Interface
 
Android Entwicklung
Android EntwicklungAndroid Entwicklung
Android Entwicklung
 
Android im Visier von Cyberkriminellen
Android im Visier von CyberkriminellenAndroid im Visier von Cyberkriminellen
Android im Visier von Cyberkriminellen
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
 
Die Android Plattform
Die Android PlattformDie Android Plattform
Die Android Plattform
 

Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

  • 1. Art of the state Funktionale Softwarearchitektur mit Plain Old Java Gunter Jantzen ¨ Capgemini 16. Januar 2013 1 1 Angepasst an jdk8 lambda-8-b117 vom 21.11.2013 Art of the state 1 / 98
  • 2. 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 2 / 98
  • 3. Die FunctionalOWL vom Hackerspace Bielefeld http://hackerspace-bielefeld.de/ Verwendung mit freundlicher Genehmigung des Kunstlers Jonah ¨ Joen Bethlehem. Art of the state 3 / 98
  • 4. Die FunctionalOWL vom Hackerspace Bielefeld Hu Art of the state 4 / 98
  • 5. Die FunctionalOWL vom Hackerspace Bielefeld HuHu Art of the state 5 / 98
  • 6. Die FunctionalOWL vom Hackerspace Bielefeld HuHu ¨ ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis. Art of the state 5 / 98
  • 7. Die FunctionalOWL vom Hackerspace Bielefeld Flash Art of the state 6 / 98
  • 8. Die FunctionalOWL vom Hackerspace Bielefeld Jetzt schreibt bitte mal Eure Namen auf die Liste. Art of the state 6 / 98
  • 9. Die FunctionalOWL vom Hackerspace Bielefeld Art of the state 7 / 98
  • 10. Die FunctionalOWL vom Hackerspace Bielefeld In der Reihenfolge, so wie ihr sitzt. Art of the state 7 / 98
  • 11. Die FunctionalOWL vom Hackerspace Bielefeld In der Reihenfolge, so wie ihr sitzt. ¨ ¨ ¨ Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr Euch ja schon mal uberlegen, wie sich das Aufschreiben ¨ ¨ parallelisieren lasst. Art of the state 7 / 98
  • 12. Die FunctionalOWL vom Hackerspace Bielefeld In der Reihenfolge, so wie ihr sitzt. ¨ ¨ ¨ Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihr Euch ja schon mal uberlegen, wie sich das Aufschreiben ¨ ¨ parallelisieren lasst. Aber die Reihenfolge muss stimmen!! Art of the state 7 / 98
  • 14. Vorgeschichte Das Entscheidungsproblem Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 9 / 98
  • 15. Vorgeschichte Das Entscheidungsproblem Gullivers Reise nach Laputa Art of the state 10 / 98
  • 16. Vorgeschichte Das Entscheidungsproblem Gullivers Reise nach Laputa 1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle ¨ mogliche Wahrheiten zu finden. Art of the state 10 / 98
  • 17. Vorgeschichte Das Entscheidungsproblem Gullivers Reise nach Laputa 1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz in der Ars Combinatoria formulierte Idee, auf kombinatorische Weise alle ¨ mogliche Wahrheiten zu finden. http://www.gutenberg.org/files/829/829-h/829-h.htm Art of the state 10 / 98
  • 18. Vorgeschichte Das Entscheidungsproblem Das Hilbertsche Programm Art of the state 11 / 98
  • 19. Vorgeschichte Das Entscheidungsproblem Das Hilbertsche Programm Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen, ¨ die Mathematik auf eine axiomatische Basis zu stellen. Art of the state 11 / 98
  • 20. Vorgeschichte Das Entscheidungsproblem Das Hilbertsche Programm Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen, ¨ die Mathematik auf eine axiomatische Basis zu stellen. In diesem Refactoring entstand die Vorstellung, der Fortschritt in der Mathematik sei nicht so sehr von den Anwendungen getrieben. Art of the state 11 / 98
  • 21. Vorgeschichte Das Entscheidungsproblem Das Hilbertsche Programm Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen, ¨ die Mathematik auf eine axiomatische Basis zu stellen. In diesem Refactoring entstand die Vorstellung, der Fortschritt in der Mathematik sei nicht so sehr von den Anwendungen getrieben. Sondern alle mathematischen Wahrheiten ließen sich mit finiten Methoden aus endlichen Axiomen und Regeln formal schematisch ableiten. Art of the state 11 / 98
  • 22. Vorgeschichte Das Entscheidungsproblem Das Hilbertsche Programm Seit Ende des 19. Jahrhunderts gab es ernsthafte Bemuhungen, ¨ die Mathematik auf eine axiomatische Basis zu stellen. In diesem Refactoring entstand die Vorstellung, der Fortschritt in der Mathematik sei nicht so sehr von den Anwendungen getrieben. Sondern alle mathematischen Wahrheiten ließen sich mit finiten Methoden aus endlichen Axiomen und Regeln formal schematisch ableiten. ¨ David Hilberts Ziel waren vollstandige und widerspruchsfreie endliche Axiomenysteme fur alle mathematischen Theorien. ¨ Art of the state 11 / 98
  • 23. Vorgeschichte Das Entscheidungsproblem ¨ ¨ ¨ Die Godelschen Unvollstandigkeitssatze Art of the state 12 / 98
  • 24. Vorgeschichte Das Entscheidungsproblem ¨ ¨ ¨ Die Godelschen Unvollstandigkeitssatze Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit ¨ ¨ ¨ den Godelschen Unvollstandigkeitssatzen einen schweren Ruckschlag. ¨ Art of the state 12 / 98
  • 25. Vorgeschichte Das Entscheidungsproblem ¨ ¨ ¨ Die Godelschen Unvollstandigkeitssatze Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit ¨ ¨ ¨ den Godelschen Unvollstandigkeitssatzen einen schweren Ruckschlag. ¨ ¨ Kurt Godel konnte zeigen, dass formale Systeme nach Art der ¨ Arithmetik weder vollstandig sind, noch dass sich deren ¨ Widerspruchsfreiheit zeigen lasst. Art of the state 12 / 98
  • 26. Vorgeschichte Das Entscheidungsproblem ¨ ¨ ¨ Die Godelschen Unvollstandigkeitssatze Das 1920 von David Hilbert formulierte Programm erlitt 1931 mit ¨ ¨ ¨ den Godelschen Unvollstandigkeitssatzen einen schweren Ruckschlag. ¨ ¨ Kurt Godel konnte zeigen, dass formale Systeme nach Art der ¨ Arithmetik weder vollstandig sind, noch dass sich deren ¨ Widerspruchsfreiheit zeigen lasst. ¨ Formal lasst sich mathematische Wahrheit nur unzureichend erfassen. Art of the state 12 / 98
  • 28. Vorgeschichte Das Entscheidungsproblem Das Entscheidungsproblem Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit dem fur eine beliebige, im formalen System der Arithmetik ¨ formulierte Aussage entschieden werden kann, ob sie mathematisch wahr ist. Art of the state 13 / 98
  • 29. Vorgeschichte Das Entscheidungsproblem Das Entscheidungsproblem Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mit dem fur eine beliebige, im formalen System der Arithmetik ¨ formulierte Aussage entschieden werden kann, ob sie mathematisch wahr ist. ¨ 1936 wurden bei zwei Zeitschriften unabhangig Arbeiten eingereicht, die zeigten, dass es in der Arithmetik nicht entscheidbare Probleme gibt. Diese Arbeiten legten nebenbei ¨ Grundlagen fur die spater entstehende Informatik. ¨ Art of the state 13 / 98
  • 30. Vorgeschichte Das Entscheidungsproblem Literatur Alonzo Church. An unsolvable problem of elementary number theory. American Journal of Mathematics, 58(2):345–363, April 1936. Church fuhrte mit dem λ-Kalkul Grundlagen der funktionalen ¨ ¨ Programmierung ein. Alan M. Turing. On computable numbers, with an application to the Entscheidungsproblem. Proceedings of the London Mathematical Society, 42:230–265, 1936. Turing fuhrte die Universelle Turing-Machine ein und zeigte, dass das ¨ ¨ Halteproblem unlosbar ist. Art of the state 14 / 98
  • 31. Vorgeschichte Das Entscheidungsproblem Die FunctionalOWL vom Hackerspace Bielefeld Hu Art of the state 15 / 98
  • 32. Vorgeschichte Das Entscheidungsproblem Die FunctionalOWL vom Hackerspace Bielefeld Die hilfreiche Eule HuHu Ich geb euch mal nen Tip. Art of the state 16 / 98
  • 33. Vorgeschichte Das Entscheidungsproblem Die FunctionalOWL vom Hackerspace Bielefeld Die hilfreiche Eule HuHu Ich geb euch mal nen Tip. Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die Klammern setzt. Art of the state 16 / 98
  • 34. Vorgeschichte Das Entscheidungsproblem Die FunctionalOWL vom Hackerspace Bielefeld Die hilfreiche Eule HuHu Ich geb euch mal nen Tip. Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die Klammern setzt. Es ist: (a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i) gerade so viel, wie einmal von vorne nach hinten gekringelt. Art of the state 16 / 98
  • 35. Vorgeschichte Das Entscheidungsproblem Die FunctionalOWL vom Hackerspace Bielefeld Die hilfreiche Eule HuHu Ich geb euch mal nen Tip. Wenn das Assoziativgesetz gilt, ist es ganz egal wie man die Klammern setzt. Es ist: (a ◦ b ◦ c) ◦ (d ◦ e ◦ f ) ◦ (g ◦ h ◦ i) gerade so viel, wie einmal von vorne nach hinten gekringelt. Das war jetzt nur ein Beispiel! Art of the state 16 / 98
  • 37. Funktionale Programmierung Einfuhrung ¨ Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 18 / 98
  • 38. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: Art of the state 19 / 98
  • 39. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. Art of the state 19 / 98
  • 40. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. sich erwartungskonform, reproduzierbar, berechenbar verhalten. Art of the state 19 / 98
  • 41. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. sich erwartungskonform, reproduzierbar, berechenbar verhalten. nach dem Vorbild von Lego kombinierbar sein. Art of the state 19 / 98
  • 42. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. sich erwartungskonform, reproduzierbar, berechenbar verhalten. nach dem Vorbild von Lego kombinierbar sein. immer neue Abstraktionen erlauben. Art of the state 19 / 98
  • 43. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. sich erwartungskonform, reproduzierbar, berechenbar verhalten. nach dem Vorbild von Lego kombinierbar sein. immer neue Abstraktionen erlauben. ohne unerwunschte Seiteneffekte interagieren. ¨ Art of the state 19 / 98
  • 44. Funktionale Programmierung Einfuhrung ¨ Motivation Die Bausteine der Programmierung sollten: einfachste Bausteine sein. sich erwartungskonform, reproduzierbar, berechenbar verhalten. nach dem Vorbild von Lego kombinierbar sein. immer neue Abstraktionen erlauben. ohne unerwunschte Seiteneffekte interagieren. ¨ Idee . . . ¨ Vielleicht hilft mathematischer Mortel? Art of the state 19 / 98
  • 45. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt Art of the state 20 / 98
  • 46. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt ¨ In der funktionalen Programmierung sind Werte unveranderlich und Funktionen keine Subroutinen, sondern mathematische Funktionen. Art of the state 20 / 98
  • 47. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt ¨ In der funktionalen Programmierung sind Werte unveranderlich und Funktionen keine Subroutinen, sondern mathematische Funktionen. Es gibt keine Wertzuweisung. Variable sind nach Initialisierung ¨ unveranderlich. Art of the state 20 / 98
  • 48. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt ¨ In der funktionalen Programmierung sind Werte unveranderlich und Funktionen keine Subroutinen, sondern mathematische Funktionen. Es gibt keine Wertzuweisung. Variable sind nach Initialisierung ¨ unveranderlich. Funktionen sind frei von Seiteneffekten. Art of the state 20 / 98
  • 49. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt ¨ In der funktionalen Programmierung sind Werte unveranderlich und Funktionen keine Subroutinen, sondern mathematische Funktionen. Es gibt keine Wertzuweisung. Variable sind nach Initialisierung ¨ unveranderlich. Funktionen sind frei von Seiteneffekten. Stop Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben? Art of the state 20 / 98
  • 50. Funktionale Programmierung Einfuhrung ¨ ¨ Hallo schone neue Welt ¨ In der funktionalen Programmierung sind Werte unveranderlich und Funktionen keine Subroutinen, sondern mathematische Funktionen. Es gibt keine Wertzuweisung. Variable sind nach Initialisierung ¨ unveranderlich. Funktionen sind frei von Seiteneffekten. Stop Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben? Weiter ¨ ¨ Wir lassen das Ratsel vorerst ungelost . . . Art of the state 20 / 98
  • 51. Funktionale Programmierung Einfuhrung ¨ Geschichte Name Λ-Kalkul ¨ Lisp ML Scheme Common Lisp Erlang Haskell OCaml Scala F# Clojure Einige funktionale Sprachen Jahr Autor 1936 Alonzo Church 1958 John McCarthy 1973 Robert Milner 1975 Steele / Sussman 1984 Komitee 1986 Ericsson, Joe Armstrong 1990 Komitee 1996 INRIA 2003 Martin Odersky 2005 Microsoft, Don Syme 2007 Rich Hickey Art of the state Typisierung dynamisch statisch dynamisch dynamisch dynamisch statisch statisch, OO statisch, OO statisch, OO dynamisch 21 / 98
  • 52. Funktionale Programmierung Einfuhrung ¨ Geschichte Name Λ-Kalkul ¨ Lisp ML Scheme Common Lisp Erlang Haskell OCaml Scala F# Clojure Einige funktionale Sprachen Jahr Autor 1936 Alonzo Church 1958 John McCarthy 1973 Robert Milner 1975 Steele / Sussman 1984 Komitee 1986 Ericsson, Joe Armstrong 1990 Komitee 1996 INRIA 2003 Martin Odersky 2005 Microsoft, Don Syme 2007 Rich Hickey Art of the state Typisierung dynamisch statisch dynamisch dynamisch dynamisch statisch statisch, OO statisch, OO statisch, OO dynamisch 21 / 98
  • 53. Funktionale Programmierung Einfuhrung ¨ Geschichte Name Λ-Kalkul ¨ Lisp ML Scheme Common Lisp Erlang Haskell OCaml Scala F# Clojure Einige funktionale Sprachen Jahr Autor 1936 Alonzo Church 1958 John McCarthy 1973 Robert Milner 1975 Steele / Sussman 1984 Komitee 1986 Ericsson, Joe Armstrong 1990 Komitee 1996 INRIA 2003 Martin Odersky 2005 Microsoft, Don Syme 2007 Rich Hickey Art of the state Typisierung dynamisch statisch dynamisch dynamisch dynamisch statisch statisch, OO statisch, OO statisch, OO dynamisch 21 / 98
  • 54. Funktionale Programmierung Einfuhrung ¨ Geschichte Name Λ-Kalkul ¨ Lisp ML Scheme Common Lisp Erlang Haskell OCaml Scala F# Clojure Einige funktionale Sprachen Jahr Autor 1936 Alonzo Church 1958 John McCarthy 1973 Robert Milner 1975 Steele / Sussman 1984 Komitee 1986 Ericsson, Joe Armstrong 1990 Komitee 1996 INRIA 2003 Martin Odersky 2005 Microsoft, Don Syme 2007 Rich Hickey Art of the state Typisierung dynamisch statisch dynamisch dynamisch dynamisch statisch statisch, OO statisch, OO statisch, OO dynamisch 21 / 98
  • 55. Funktionale Programmierung Einfuhrung ¨ Geschichte Name Λ-Kalkul ¨ Lisp ML Scheme Common Lisp Erlang Haskell OCaml Scala F# Clojure Einige funktionale Sprachen Jahr Autor 1936 Alonzo Church 1958 John McCarthy 1973 Robert Milner 1975 Steele / Sussman 1984 Komitee 1986 Ericsson, Joe Armstrong 1990 Komitee 1996 INRIA 2003 Martin Odersky 2005 Microsoft, Don Syme 2007 Rich Hickey Art of the state Typisierung dynamisch statisch dynamisch dynamisch dynamisch statisch statisch, OO statisch, OO statisch, OO dynamisch 21 / 98
  • 56. Funktionale Programmierung Einfuhrung ¨ Geschichte Einige funktionale Sprachen Name Jahr Autor Typisierung Λ-Kalkul 1936 Alonzo Church ¨ Lisp 1958 John McCarthy dynamisch ML 1973 Robert Milner statisch Scheme 1975 Steele / Sussman dynamisch Common Lisp 1984 Komitee dynamisch Erlang 1986 Ericsson, Joe Armstrong dynamisch Haskell 1990 Komitee statisch OCaml 1996 INRIA statisch, OO Scala 2003 Martin Odersky statisch, OO F# 2005 Microsoft, Don Syme statisch, OO Clojure 2007 Rich Hickey dynamisch Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2 ¨ 2 Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011. Art of the state 21 / 98
  • 57. Funktionale Programmierung Einfuhrung ¨ Theoretisches Intermezzo Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert ¨ ¨ ausschließlich von den Argumenten abhangt und ohne Seiteneffekte berechnet wird. Art of the state 22 / 98
  • 58. Funktionale Programmierung Einfuhrung ¨ Theoretisches Intermezzo Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert ¨ ¨ ausschließlich von den Argumenten abhangt und ohne Seiteneffekte berechnet wird. Beispiel: sum(), max(), size(). Art of the state 22 / 98
  • 59. Funktionale Programmierung Einfuhrung ¨ Theoretisches Intermezzo Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert ¨ ¨ ausschließlich von den Argumenten abhangt und ohne Seiteneffekte berechnet wird. Beispiel: sum(), max(), size(). Referentielle Transparenz Ein Ausdruck heißt referentiell transparent, wenn er durch seinen Wert ersetzt werden kann, ohne ¨ das Verhalten des Programms zu verandern. Art of the state 22 / 98
  • 60. Funktionale Programmierung Einfuhrung ¨ Theoretisches Intermezzo Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert ¨ ¨ ausschließlich von den Argumenten abhangt und ohne Seiteneffekte berechnet wird. Beispiel: sum(), max(), size(). Referentielle Transparenz Ein Ausdruck heißt referentiell transparent, wenn er durch seinen Wert ersetzt werden kann, ohne ¨ das Verhalten des Programms zu verandern. Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu ¨ Einzeilern zusammenzuschieben. Art of the state 22 / 98
  • 61. Funktionale Programmierung Einfuhrung ¨ Theoretisches Intermezzo Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewert ¨ ¨ ausschließlich von den Argumenten abhangt und ohne Seiteneffekte berechnet wird. Beispiel: sum(), max(), size(). Referentielle Transparenz Ein Ausdruck heißt referentiell transparent, wenn er durch seinen Wert ersetzt werden kann, ohne ¨ das Verhalten des Programms zu verandern. Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zu ¨ Einzeilern zusammenzuschieben. Das ist nicht immer eine gute Idee. Art of the state 22 / 98
  • 62. Funktionale Programmierung Fraktales SQL Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 23 / 98
  • 63. Funktionale Programmierung Fraktales SQL Fraktales SQL Obfuscated Query contest In den Nesseln eines fraktalen Ungeheuers? ¨ Selects konnen uberall Selects ¨ enthalten und es sind nur Einzeiler ¨ moglich. WITH LatestOrders (ID) AS (SELECT MAX(ID) FROM dbo.Orders GROUP BY CustomerID) SELECT Customers.∗, Orders.OrderTime AS LatestOrderTime, (SELECT COUNT(∗) FROM dbo.OrderItems WHERE OrderID IN (SELECT ID FROM dbo.Orders WHERE CustomerID = Customers.ID)) AS TotalItemsPurchased FROM dbo.Customers INNER JOIN dbo.Orders ON Customers.ID = Orders.CustomerID WHERE Orders.ID IN (SELECT ID FROM LatestOrders) Art of the state www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx 24 / 98
  • 64. Funktionale Programmierung Fraktales SQL Fraktales SQL Obfuscated Query contest In den Nesseln eines fraktalen Ungeheuers? ¨ Selects konnen uberall Selects ¨ enthalten und es sind nur Einzeiler ¨ moglich. Doch werden keine Werte ¨ verandert. WITH LatestOrders (ID) AS (SELECT MAX(ID) FROM dbo.Orders GROUP BY CustomerID) SELECT Customers.∗, Orders.OrderTime AS LatestOrderTime, (SELECT COUNT(∗) FROM dbo.OrderItems WHERE OrderID IN (SELECT ID FROM dbo.Orders WHERE CustomerID = Customers.ID)) AS TotalItemsPurchased FROM dbo.Customers INNER JOIN dbo.Orders ON Customers.ID = Orders.CustomerID WHERE Orders.ID IN (SELECT ID FROM LatestOrders) Art of the state www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx 24 / 98
  • 65. Funktionale Programmierung Fraktales SQL Fraktales SQL Obfuscated Query contest In den Nesseln eines fraktalen Ungeheuers? ¨ Selects konnen uberall Selects ¨ enthalten und es sind nur Einzeiler ¨ moglich. Doch werden keine Werte ¨ verandert. Und Funktionen haben keine Seiteneffekte. WITH LatestOrders (ID) AS (SELECT MAX(ID) FROM dbo.Orders GROUP BY CustomerID) SELECT Customers.∗, Orders.OrderTime AS LatestOrderTime, (SELECT COUNT(∗) FROM dbo.OrderItems WHERE OrderID IN (SELECT ID FROM dbo.Orders WHERE CustomerID = Customers.ID)) AS TotalItemsPurchased FROM dbo.Customers INNER JOIN dbo.Orders ON Customers.ID = Orders.CustomerID WHERE Orders.ID IN (SELECT ID FROM LatestOrders) Art of the state www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx 24 / 98
  • 66. Funktionale Programmierung Fraktales SQL Fraktales SQL Nicht das schrecklichste Ungeheuer der Meere http://commons.wikimedia.org/wiki/File:Millepora_fire_coral.JPG Art of the state 25 / 98
  • 67. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Art of the state 26 / 98
  • 68. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Aufgrund des funktionalen Aufbaus sind verschachtelte Selects wartbarer als etwa C-Einzeiler. Art of the state 26 / 98
  • 69. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Aufgrund des funktionalen Aufbaus sind verschachtelte Selects wartbarer als etwa C-Einzeiler. Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen ¨ als Stored Procedures ist moglich. Art of the state 26 / 98
  • 70. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Aufgrund des funktionalen Aufbaus sind verschachtelte Selects wartbarer als etwa C-Einzeiler. Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen ¨ als Stored Procedures ist moglich. Zwischen lesenden und schreibenden Zugriffen in SQL besteht eine klare Trennung. Art of the state 26 / 98
  • 71. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Aufgrund des funktionalen Aufbaus sind verschachtelte Selects wartbarer als etwa C-Einzeiler. Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen ¨ als Stored Procedures ist moglich. Zwischen lesenden und schreibenden Zugriffen in SQL besteht eine klare Trennung. ¨ Selbst in Updates3 besteht der großte Teil der Syntax aus Selects. Art of the state 26 / 98
  • 72. Funktionale Programmierung Fraktales SQL Fraktales SQL Fazit ¨ Verschachtelte Selects sind nicht schon. Sprachliche Mittel zum ¨ Entflechten waren wunschenswert. Doch die Vorteile des funktionalen ¨ Designs sind sichtbar: Aufgrund des funktionalen Aufbaus sind verschachtelte Selects wartbarer als etwa C-Einzeiler. Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionen ¨ als Stored Procedures ist moglich. Zwischen lesenden und schreibenden Zugriffen in SQL besteht eine klare Trennung. ¨ Selbst in Updates3 besteht der großte Teil der Syntax aus Selects. 3 und gelegentlich auch in Inserts Art of the state 26 / 98
  • 73. Funktionale Programmierung Fraktales SQL Persistente Datenstrukturen ¨ Bausteine der Funktionalen Programmierung sind unveranderliche Datenstrukturen. Art of the state 27 / 98
  • 74. Funktionale Programmierung Fraktales SQL Persistente Datenstrukturen ¨ Bausteine der Funktionalen Programmierung sind unveranderliche Datenstrukturen. Frage Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder ¨ Anderung eine neue Collection anlegen zu mussen? ¨ Art of the state 27 / 98
  • 75. Funktionale Programmierung Fraktales SQL Persistente Datenstrukturen ¨ Bausteine der Funktionalen Programmierung sind unveranderliche Datenstrukturen. Frage Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder ¨ Anderung eine neue Collection anlegen zu mussen? ¨ Antwort ¨ Aus der Verwendung unveranderlicher Bausteine entstehen ganz ¨ neue Moglichkeiten der Wiederverwendung. Art of the state 27 / 98
  • 76. Funktionale Programmierung Fraktales SQL Persistente Datenstrukturen ¨ Bausteine der Funktionalen Programmierung sind unveranderliche Datenstrukturen. Frage Ist es nicht eine unglaubliche Ressourcenverschwendung, bei jeder ¨ Anderung eine neue Collection anlegen zu mussen? ¨ Antwort ¨ Aus der Verwendung unveranderlicher Bausteine entstehen ganz ¨ neue Moglichkeiten der Wiederverwendung. Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zu ¨ tun. Persistente Datenstrukturen erhalten bei Anderungen die vorherige Version, speichern jeweils nur die Differenz ¨ und sind damit im Effekt unveranderlich. Art of the state 27 / 98
  • 77. Funktionale Programmierung Fraktales SQL Eine persistente Datenstruktur aus dem Jahr 2000 4 public class FullIntList extends IntList { private int sz; private Object val ; private IntList next; public FullIntList (Object x) { sz = 1; val = x; next = new EmptyIntlist() ; } public Object first () { return val ; } public Object rest () { return next; } public IntList addEl(Object x) { FullIntList n = new FullIntList(x); n.next = this; n.sz = this .sz + 1; return n; } } 4 Figure 7.1.3 aus Barbara Liskov with John Guttag: Program Development in Java : Abstraction, Specification, and Object-Oriented Design. 1. Aufl.. 2000. Art of the state 28 / 98
  • 78. Funktionale Programmierung Eine funktionale Berechnung Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 29 / 98
  • 79. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung ¨ d’hondtsches Hochstzahlverfahren Das Verfahren nach d’Hondt ist bei den Landtagswahlen in Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein maßgeblich fur die Sitzzuteilung (Zweitstimmen). ¨ 5 ¨ Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/ de/glossar/texte/d_Hondtsche_Sitzverteilung.html Art of the state 30 / 98
  • 80. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung ¨ d’hondtsches Hochstzahlverfahren Das Verfahren nach d’Hondt ist bei den Landtagswahlen in Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein maßgeblich fur die Sitzzuteilung (Zweitstimmen). ¨ Die Stimmen der Parteien werden durch eine Folge von Divisoren ¨ geteilt. Die Sitze werden in der Reihenfolge der großten sich 5 ¨ ergebenen Hochstzahlen zugeteilt. 5 ¨ Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/ de/glossar/texte/d_Hondtsche_Sitzverteilung.html Art of the state 30 / 98
  • 81. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung ¨ d’hondtsches Hochstzahlverfahren Das Verfahren nach d’Hondt ist bei den Landtagswahlen in Niedersachsen, im Saarland, in Sachsen und Schleswig-Holstein maßgeblich fur die Sitzzuteilung (Zweitstimmen). ¨ Die Stimmen der Parteien werden durch eine Folge von Divisoren ¨ geteilt. Die Sitze werden in der Reihenfolge der großten sich 5 ¨ ergebenen Hochstzahlen zugeteilt. Den Sonderfall Stimmengleichheit beim letzten Sitz ¨ vernachlassigen wir. 5 ¨ Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/ de/glossar/texte/d_Hondtsche_Sitzverteilung.html Art of the state 30 / 98
  • 82. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Art of the state 31 / 98
  • 83. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 10000 6000 1500 5000 3000 750 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 84. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 6000 1500 5000 3000 750 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 85. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 5000 3000 750 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 86. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 3000 750 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 87. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 3000 750 4. 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 88. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 5. 3000 750 4. 3333 2000 500 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 89. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 5. 3000 750 4. 3333 2000 500 6. 2500 1500 375 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 90. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 5. 3000 750 4. 3333 2000 500 6. 2500 1500 375 7. 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 91. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 1500 3. 5000 5. 3000 750 4. 3333 8. 2000 500 6. 2500 1500 375 7. 2000 1200 300 1667 1000 250 1429 857 214 1250 750 188 Art of the state 31 / 98
  • 92. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 3. 5000 5. 3000 4. 3333 8. 2000 6. 2500 7. 2000 5 3 Art of the state 0 31 / 98
  • 93. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Am Wahlabend Der NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungen vorliegen. Teiler 1 2 3 4 5 6 7 8 Sitze Zuteilung von 8 Sitzen Partei A Partei B Partei C 1. 10000 2. 6000 3. 5000 5. 3000 4. 3333 8. 2000 6. 2500 7. 2000 5 3 0 Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalen Programmierstudio. Art of the state 31 / 98
  • 94. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Schritt fur Schritt ¨ Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor: [(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu vergeben. Art of the state 32 / 98
  • 95. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Schritt fur Schritt ¨ Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor: [(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu vergeben. Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum i und i aus 1, 2, ..sitze: [(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)]. Art of the state 32 / 98
  • 96. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Schritt fur Schritt ¨ Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor: [(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu vergeben. Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum i und i aus 1, 2, ..sitze: [(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)]. Sortiere quotienten absteigend nach der zweiten Komponente und nehme die ersten sitze Paare in eine neue Liste auf: [(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)] Art of the state 32 / 98
  • 97. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Schritt fur Schritt ¨ Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor: [(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu vergeben. Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum i und i aus 1, 2, ..sitze: [(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)]. Sortiere quotienten absteigend nach der zweiten Komponente und nehme die ersten sitze Paare in eine neue Liste auf: [(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)] Bilde daraus die Liste plazierung, die von jedem Paar nur die ¨ Partei-Komponente enthalt [A, B, A, A, B, A, B, A] Art of the state 32 / 98
  • 98. Funktionale Programmierung Eine funktionale Berechnung Eine funktionale Berechnung Schritt fur Schritt ¨ Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor: [(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zu vergeben. Bilde neue Liste quotienten der Paare (p, v ) mit (p, v) aus votum i und i aus 1, 2, ..sitze: [(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)]. Sortiere quotienten absteigend nach der zweiten Komponente und nehme die ersten sitze Paare in eine neue Liste auf: [(A, 10000), (B, 6000), (A, 5000), (A, 3333), (B, 3000), (A, 2500), (B, 2000), (A, 2000)] Bilde daraus die Liste plazierung, die von jedem Paar nur die ¨ Partei-Komponente enthalt [A, B, A, A, B, A, B, A] Filtere nach den einzelnen Parteien. Jedes der Filtrate [A, A, A, A, A], [B, B, B] und [] ist dann eine sitzliste. Partei A ¨ ¨ erhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen. Art of the state 32 / 98
  • 99. Funktionale Programmierung Konzepte und Programme Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 33 / 98
  • 100. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann Art of the state 34 / 98
  • 101. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann eine Funktion einer anderen Funktion als Argument ubergeben ¨ werden, Art of the state 34 / 98
  • 102. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann eine Funktion einer anderen Funktion als Argument ubergeben ¨ werden, eine Funktion eine andere Funktion als Ruckgabewert haben, ¨ Art of the state 34 / 98
  • 103. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann eine Funktion einer anderen Funktion als Argument ubergeben ¨ werden, eine Funktion eine andere Funktion als Ruckgabewert haben, ¨ eine Funktion einer Variablen zugewiesen werden, Art of the state 34 / 98
  • 104. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann eine Funktion einer anderen Funktion als Argument ubergeben ¨ werden, eine Funktion eine andere Funktion als Ruckgabewert haben, ¨ eine Funktion einer Variablen zugewiesen werden, eine Funktion in einer Datenstruktur gespeichert werden, Art of the state 34 / 98
  • 105. Funktionale Programmierung Konzepte und Programme First-Class Functions ¨ Die funktionale Berechnung des Wahlergebnis lasst sich mit jeder Programmiersprache durchfuhren. Es ist jedoch einfacher in Sprachen, ¨ in denen Funktionen first class citizen sind. In diesen Sprachen kann eine Funktion einer anderen Funktion als Argument ubergeben ¨ werden, eine Funktion eine andere Funktion als Ruckgabewert haben, ¨ eine Funktion einer Variablen zugewiesen werden, eine Funktion in einer Datenstruktur gespeichert werden, eine Funktion zur Laufzeit erzeugt werden. Art of the state 34 / 98
  • 106. Funktionale Programmierung Konzepte und Programme Higher Order Functions ¨ Erklarung und Beispiele ¨ Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als ¨ Argumente erhalt oder Funktionen als Ergebnis liefert. Art of the state 35 / 98
  • 107. Funktionale Programmierung Konzepte und Programme Higher Order Functions ¨ Erklarung und Beispiele ¨ Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als ¨ Argumente erhalt oder Funktionen als Ergebnis liefert. compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x. ¨ So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4], f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10. Art of the state 35 / 98
  • 108. Funktionale Programmierung Konzepte und Programme Higher Order Functions ¨ Erklarung und Beispiele ¨ Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als ¨ Argumente erhalt oder Funktionen als Ergebnis liefert. compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x. ¨ map map(f, seq) erstellt eine neue Sequenz durch Anwendung der Funktion f auf alle Elemente von seq. So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4], f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10. Art of the state 35 / 98
  • 109. Funktionale Programmierung Konzepte und Programme Higher Order Functions ¨ Erklarung und Beispiele ¨ Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als ¨ Argumente erhalt oder Funktionen als Ergebnis liefert. compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x. ¨ map map(f, seq) erstellt eine neue Sequenz durch Anwendung der Funktion f auf alle Elemente von seq. filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch ¨ die Elemente von seq enthalt, fur die die boolesche ¨ Funktion test zutrifft. So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4], f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10. Art of the state 35 / 98
  • 110. Funktionale Programmierung Konzepte und Programme Higher Order Functions ¨ Erklarung und Beispiele ¨ Eine Funktion hoherer Ordnung ist eine Funktion, die Funktionen als ¨ Argumente erhalt oder Funktionen als Ergebnis liefert. compose f ◦ g ist die Funktion, mit x → f (g(x) fur alle x. ¨ map map(f, seq) erstellt eine neue Sequenz durch Anwendung der Funktion f auf alle Elemente von seq. filter f ilter(test, seq) erstellt eine neue Sequenz, die nur noch ¨ die Elemente von seq enthalt, fur die die boolesche ¨ Funktion test zutrifft. ¨ reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufend auf eine Sequenz an und liefert einen einzelnen Wert zuruck. ¨ So ist map(upper, ”Hu”) = ”HU ”, f ilter(istGerade, [1, 2, 3, 4]) = [2, 4], f ilter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10. Art of the state 35 / 98
  • 111. Funktionale Programmierung Konzepte und Programme Higher Order Functions Weitere Beispiele In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an: 6 Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming. 1. Aufl.. No Starch Press, 2011. Art of the state 36 / 98
  • 112. Funktionale Programmierung Konzepte und Programme Higher Order Functions Weitere Beispiele In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an: <html><head><meta charset="UTF-8"></head> <body><script src = "higher-order.js" type="text/javascript"> </script></body></html> 6 Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming. 1. Aufl.. No Starch Press, 2011. Art of the state 36 / 98
  • 113. Funktionale Programmierung Konzepte und Programme Higher Order Functions Weitere Beispiele In einer Sprache, die ihr alle kennt, schauen wir uns das gleich an: <html><head><meta charset="UTF-8"></head> <body><script src = "higher-order.js" type="text/javascript"> </script></body></html> ¨ Zur Vertiefung empfehle ich dieses schone Buch6 http://eloquentjavascript.net/chapter6.html 6 Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming. 1. Aufl.. No Starch Press, 2011. Art of the state 36 / 98
  • 114. Funktionale Programmierung Konzepte und Programme Higher Order Functions im Einsatz var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333], [’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]] // erste Komponente, z.B. ’A’ fur first ([’ A’, 10000]) ¨ function first (a) {return a[0]} // eq(a) gibt Funktion zuruck, die Gleichheit mit a prueft ¨ function eq(a){ return function (b){return a == b} } // map(first ) −> [ABAABABA], filter(eq(A)) −> [AAAAA] function sitzliste ( partei ) { return plazierung.map(first ) . filter (eq(partei) ) } // length [AAAAA] = 5 for each (var p in [’A’, ’B’, ’C’]) { document.write(p + ’:’ + sitzliste (p).length+ ’ ’) } Art of the state 37 / 98
  • 115. Funktionale Programmierung Konzepte und Programme Higher Order Functions Comprehensions Statt map und filter werden gerne List Comprehensions genommen. ¨ Als Bonus erhalt man noch ein ein einfaches Pattern Matching. list-comprehension.js var plazierung = [[ ’A’, 10000], [’B’, 6000], [’A’, 5000], [’A’, 3333], [’B’, 3000], [’A’, 2500], [’B’, 2000], [’A’, 2000]] function sitzliste ( partei ) { return [p for each([p, q] in plazierung) if (p == partei) ] } for each (var p in [’A’, ’B’, ’C’]) { document.write(p + ’:’ + sitzliste (p).length+ ’ ’) } Art of the state 38 / 98
  • 116. Funktionale Programmierung Konzepte und Programme Das Wahlprogramm /∗∗ script type =”application / javascript ;version=1.7 ∗∗/ function range(begin, end){ for ( let i = begin; i < end; ++i){yield i ;}} var sitze = 8, votum = [[’A’, 10000], [’C’, 1500], [’B’, 6000]]; var plazierung = [[ p, v/ i ] for ( i in range(1, sitze +1)) for each ([p, v] in votum)] . sort ( function (a, b){return b[1] − a[1]}) . slice (0, sitze ) ; function sitzliste ( partei ) { return [p for each([p, q] in plazierung) if (p == partei) ] } for each (var p in [’A’, ’B’, ’C’]) { document.write(p + ’:’ + sitzliste (p).length+ ’ ’) } Art of the state 39 / 98
  • 117. Funktionale Programmierung Konzepte und Programme Lazy Evaluation Generator Expressions in JavaScript 1.8 erlauben Lazy Evaluation. /∗∗ script type =”application / javascript ;version=1.8 ∗∗/ // ALLE natuerlichen Zahlen function nat() { var i = 0; while (true) { yield i ; i +=1; } } // ALLE Zahlen , deren Quadrate groesser als 1000 sind var q1000 = (i for each (i in nat() ) if ( i ∗i > 1000)); // Die erste Zahl, deren Quadrat groesser als 1000 ist, ist 32 document.write(q1000.next()) Art of the state 40 / 98
  • 118. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Seiltanzer Pierre Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great Good von Miran Lipovaˇ a7 und ist auch online verfugbar. c ¨ http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line 7 Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1. c Aufl.. No Starch Press, 2011. Art of the state 41 / 98
  • 119. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Seiltanzer Pierre Dieses Beispiel kommt aus dem Buch Learn you a Haskell for Great Good von Miran Lipovaˇ a7 und ist auch online verfugbar. c ¨ http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line Das Buch ist unbedingt empfehlenswert. 7 Lipovaˇ a, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1. c Aufl.. No Starch Press, 2011. Art of the state 41 / 98
  • 120. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Art of the state 42 / 98
  • 121. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange ¨ Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu ¨ kampfen. Art of the state 42 / 98
  • 122. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange ¨ Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu ¨ kampfen. ¨ Vogel auf der Balancierstange! Art of the state 42 / 98
  • 123. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange ¨ Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu ¨ kampfen. ¨ Vogel auf der Balancierstange! ¨ ¨ Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre ¨ ins Netz. Der Unterschied darf hochstens drei sein. Art of the state 42 / 98
  • 124. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange ¨ Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zu ¨ kampfen. ¨ Vogel auf der Balancierstange! ¨ ¨ Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierre ¨ ins Netz. Der Unterschied darf hochstens drei sein. Ein Haskell-Programm soll nach erfolgreichem Seilgang den Vogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing. ¨ Art of the state 42 / 98
  • 125. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Art of the state 43 / 98
  • 126. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Haskell kennt keine Exceptions, eine pure Function soll sich nicht durch Seiteneffekte aus der Ruhe bringen lassen. Art of the state 43 / 98
  • 127. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Haskell kennt keine Exceptions, eine pure Function soll sich nicht durch Seiteneffekte aus der Ruhe bringen lassen. Pierre1.hs routine :: Maybe Pole routine = case landLeft 1 (0,0) of Nothing −> Nothing Just pole1 −> case landRight 4 pole1 of Nothing −> Nothing Just pole2 −> case landLeft 2 pole2 of Nothing −> Nothing Just pole3 −> landLeft 1 pole3 Art of the state 43 / 98
  • 128. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Haskell kennt keine Exceptions, eine pure Function soll sich nicht durch Seiteneffekte aus der Ruhe bringen lassen. Pierre1.hs routine :: Maybe Pole routine = case landLeft 1 (0,0) of Nothing −> Nothing Just pole1 −> case landRight 4 pole1 of Nothing −> Nothing Just pole2 −> case landLeft 2 pole2 of Nothing −> Nothing Just pole3 −> landLeft 1 pole3 Ein Vogel landet links, vier landen rechts, zwei links, noch einer links. Art of the state 43 / 98
  • 129. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon ¨ Vogel auf der Balancierstange Haskell kennt keine Exceptions, eine pure Function soll sich nicht durch Seiteneffekte aus der Ruhe bringen lassen. Pierre1.hs routine :: Maybe Pole routine = case landLeft 1 (0,0) of Nothing −> Nothing Just pole1 −> case landRight 4 pole1 of Nothing −> Nothing Just pole2 −> case landLeft 2 pole2 of Nothing −> Nothing Just pole3 −> landLeft 1 pole3 Ein Vogel landet links, vier landen rechts, zwei links, noch einer links. ¨ Schon bekommt das Programm einen leichten Seitwartsdrall. Art of the state 43 / 98
  • 130. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon Kontrollierter Umgang mit Seiteneffekten in Haskell Art of the state 44 / 98
  • 131. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon Kontrollierter Umgang mit Seiteneffekten in Haskell Weder Haskell noch Pierre lassen sich aus der Ruhe bringen. Pierre2.hs routine2 :: Maybe Pole routine2 = do start <− return (0, 0) pole0 <− landLeft 1 start pole1 <− landRight 4 pole0 pole2 <− landLeft 2 pole1 landLeft 1 pole2 Art of the state 44 / 98
  • 132. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon Kontrollierter Umgang mit Seiteneffekten in Haskell Weder Haskell noch Pierre lassen sich aus der Ruhe bringen. Pierre2.hs routine2 :: Maybe Pole routine2 = do start <− return (0, 0) pole0 <− landLeft 1 start pole1 <− landRight 4 pole0 pole2 <− landLeft 2 pole1 landLeft 1 pole2 Pierre3.hs routine3 = return (0,0) >>= landLeft 1 >>= landRight 4 >>= landLeft 2 >>= landLeft 1 Art of the state 44 / 98
  • 133. Funktionale Programmierung Konzepte und Programme Das programmierbare Semikolon Was war jetzt der Trick mit der Banane? type Birds = Int type Pole = (Birds, Birds) landLeft :: Birds −> Pole −> Maybe Pole landLeft n ( left , right ) | abs (( left + n) − right ) < 4 = Just ( left + n, right ) | otherwise = Nothing landRight :: Birds −> Pole −> Maybe Pole landRight n ( left , right ) | abs ( left − ( right + n)) < 4 = Just ( left , right + n) | otherwise = Nothing banana :: Pole −> Maybe Pole banana = Nothing Art of the state 45 / 98
  • 134. Funktionale Programmierung Konzepte und Programme Die Antwort auf eine andere offene Frage Art of the state 46 / 98
  • 135. Funktionale Programmierung Konzepte und Programme Die Antwort auf eine andere offene Frage Frage Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben? Art of the state 46 / 98
  • 136. Funktionale Programmierung Konzepte und Programme Die Antwort auf eine andere offene Frage Frage Wie soll man ein Hello World Programm ohne Seiteneffekte schreiben? Antwort Das geht nicht, aber die funktionale Programmierung verfugt uber ¨ ¨ Mittel und Wege, Seiteneffekte zu kontrollieren. Art of the state 46 / 98
  • 137. Funktionale Programmierung Konzepte und Programme Die FunctionalOWL vom Hackerspace Bielefeld Hu Art of the state 47 / 98
  • 138. Funktionale Programmierung Konzepte und Programme Die FunctionalOWL vom Hackerspace Bielefeld Die schlaue Eule HuHu Na, habt ihrs rausgefunden? Art of the state 48 / 98
  • 139. Funktionale Programmierung Konzepte und Programme Die FunctionalOWL vom Hackerspace Bielefeld Die schlaue Eule HuHu Na, habt ihrs rausgefunden? Richtig, jede Reihe kann einen eigenen Zettel ausfullen. ¨ Art of the state 48 / 98
  • 140. Funktionale Programmierung Konzepte und Programme Die FunctionalOWL vom Hackerspace Bielefeld Die schlaue Eule HuHu Na, habt ihrs rausgefunden? Richtig, jede Reihe kann einen eigenen Zettel ausfullen. ¨ ¨ Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge ¨ zusammenheften. Art of the state 48 / 98
  • 141. Funktionale Programmierung Konzepte und Programme Die FunctionalOWL vom Hackerspace Bielefeld Die schlaue Eule HuHu Na, habt ihrs rausgefunden? Richtig, jede Reihe kann einen eigenen Zettel ausfullen. ¨ ¨ Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolge ¨ zusammenheften. ¨ Nachstes Mal! Art of the state 48 / 98
  • 142. Lambda Expressions in Java 8 Lambda Expressions in Java 8 Art of the state 49 / 98
  • 143. Lambda Expressions in Java 8 Motivation Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 50 / 98
  • 144. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Art of the state 51 / 98
  • 145. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Interne Iteration SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’ Art of the state 51 / 98
  • 146. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Interne Iteration SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’ Externe Iteration int sum = 0; for (Wahlkreis wk : wahlkreise) { if ( partei .equals(wk.partei)) { sum += wk.stimmen; } } Art of the state 51 / 98
  • 147. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Interne Iteration SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’ Externe Iteration int sum = 0; for (Wahlkreis wk : wahlkreise) { if ( partei .equals(wk.partei)) { sum += wk.stimmen; } } Frage Wo ist hier noch Spielraum? Art of the state 51 / 98
  • 148. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Collections sind ein idealer Kandidat fur parallele Verarbeitung. ¨ Art of the state 52 / 98
  • 149. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Collections sind ein idealer Kandidat fur parallele Verarbeitung. ¨ ¨ Logik gehort in die Library (vgl. SQL) Art of the state 52 / 98
  • 150. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Collections sind ein idealer Kandidat fur parallele Verarbeitung. ¨ ¨ Logik gehort in die Library (vgl. SQL) Problem externe Iteration Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung. ¨ Art of the state 52 / 98
  • 151. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Collections sind ein idealer Kandidat fur parallele Verarbeitung. ¨ ¨ Logik gehort in die Library (vgl. SQL) Problem externe Iteration Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung. ¨ ¨ Problem Kompatibilitat ¨ Man kann nicht so ohne weiteres die Libraries andern. Art of the state 52 / 98
  • 152. Lambda Expressions in Java 8 Motivation Probleme mit den Collections Bibliotheken brauchen Spielraum fur Parallelisierung ¨ Collections sind ein idealer Kandidat fur parallele Verarbeitung. ¨ ¨ Logik gehort in die Library (vgl. SQL) Problem externe Iteration Sequentielle Iteration gibt keinen Spielraum fur Parallelisierung. ¨ ¨ Problem Kompatibilitat ¨ Man kann nicht so ohne weiteres die Libraries andern. ¨ Losung Java Language Architect Brian Goetz und sein Team haben daher die ¨ Sprache Java geandert. Art of the state 52 / 98
  • 153. Lambda Expressions in Java 8 Collections und Higher-Order Functions Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 53 / 98
  • 154. Lambda Expressions in Java 8 Collections und Higher-Order Functions ¨ Abwartskompatibler Warp-Antrieb lambda-8-b117 vom 21.11.2013 Art of the state 54 / 98
  • 155. Lambda Expressions in Java 8 Collections und Higher-Order Functions ¨ Abwartskompatibler Warp-Antrieb lambda-8-b117 vom 21.11.2013 java/util/Collection.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , 0); } Art of the state 54 / 98
  • 156. Lambda Expressions in Java 8 Collections und Higher-Order Functions ¨ Abwartskompatibler Warp-Antrieb lambda-8-b117 vom 21.11.2013 java/util/Collection.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , 0); } java/util/List.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , Spliterator .ORDERED); } Art of the state 54 / 98
  • 157. Lambda Expressions in Java 8 Collections und Higher-Order Functions ¨ Abwartskompatibler Warp-Antrieb lambda-8-b117 vom 21.11.2013 java/util/Collection.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , 0); } java/util/List.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , Spliterator .ORDERED); } Aha, polymorphe Default Implemetierung in Interfaces und . . . Art of the state 54 / 98
  • 158. Lambda Expressions in Java 8 Collections und Higher-Order Functions ¨ Abwartskompatibler Warp-Antrieb lambda-8-b117 vom 21.11.2013 java/util/Collection.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , 0); } java/util/List.java @Override default Spliterator <E> spliterator() { return Spliterators . spliterator ( this , Spliterator .ORDERED); } Aha, polymorphe Default Implemetierung in Interfaces und . . . SPLITERATOR Art of the state 54 / 98
  • 159. Lambda Expressions in Java 8 Collections und Higher-Order Functions Disclaimer Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu ¨ ¨ klaren, andere konnen das besser. Insbesondere verweise ich auf ¨ Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von Brian Goetz und Maurice Naftalin: http://openjdk.java.net/projects/lambda/ http://www.lambdafaq.org/ http://naftalin.org/maurice/professional/talks/ cAfter8_devoxx2012.pdf https://blogs.oracle.com/briangoetz/resource/ devoxx-lang-lib-vm-co-evol.pdf Art of the state 55 / 98
  • 160. Lambda Expressions in Java 8 Collections und Higher-Order Functions Disclaimer Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zu ¨ ¨ klaren, andere konnen das besser. Insbesondere verweise ich auf ¨ Maurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen von Brian Goetz und Maurice Naftalin: http://openjdk.java.net/projects/lambda/ http://www.lambdafaq.org/ http://naftalin.org/maurice/professional/talks/ cAfter8_devoxx2012.pdf https://blogs.oracle.com/briangoetz/resource/ devoxx-lang-lib-vm-co-evol.pdf Aber was ist jetzt mit diesen Streams? Art of the state 55 / 98
  • 161. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream in Action Art of the state 56 / 98
  • 162. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream in Action Parametrisierung mit anonymen Klassen int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) { Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){ public boolean test(Wahlkreis wk) { return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8 } }; ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() { public int applyAsInt(Wahlkreis wk) { return wk.stimmen; } }; return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum(); } Art of the state 56 / 98
  • 163. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream in Action Parametrisierung mit anonymen Klassen int sumStimmenAno(List<Wahlkreis> wahlkreise, String partei) { Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){ public boolean test(Wahlkreis wk) { return partei .equals(wk.partei); // Vor Java 8 Fehlermeldung 8 } }; ToIntFunction<Wahlkreis> mpStimm = new ToIntFunction<Wahlkreis>() { public int applyAsInt(Wahlkreis wk) { return wk.stimmen; } }; return wahlkreise.stream(). filter ( testPartei ) .mapToInt(mpStimm).sum(); } 8 Cannot refer to a non-final variable partei inside an inner class defined in a different method Art of the state 56 / 98
  • 164. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions in Java Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp. Art of the state 57 / 98
  • 165. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions in Java Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp. Java Funktionen sind keine First-Class Funktionen. Art of the state 57 / 98
  • 166. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions in Java Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp. Java Funktionen sind keine First-Class Funktionen. Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order ¨ Functions moglich. Art of the state 57 / 98
  • 167. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions in Java Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp. Java Funktionen sind keine First-Class Funktionen. Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order ¨ Functions moglich. Anonyme Klassen sind jedoch absolute Holzklasse. Art of the state 57 / 98
  • 168. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions in Java Das Java Typsystem erlaubt mittelfristig keinen Funktionstyp. Java Funktionen sind keine First-Class Funktionen. Aber auch in der zweiten Klasse ist das Arbeiten mit Higher-Order ¨ Functions moglich. Anonyme Klassen sind jedoch absolute Holzklasse. Wir werden bald was besseres haben . . . Art of the state 57 / 98
  • 169. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Art of the state 58 / 98
  • 170. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Manche Higher-Order Functions wie map und filter sind lazy und ¨ werden zunachst nur in die Verarbeitungs-Queue aufgenommen. Art of the state 58 / 98
  • 171. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Manche Higher-Order Functions wie map und filter sind lazy und ¨ werden zunachst nur in die Verarbeitungs-Queue aufgenommen. Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu ¨ zwingende eager Higher Order Funktion wie reduce kommt, die ¨ ¨ naturgemaß am Ende steht und die Verarbeitung auslost. Art of the state 58 / 98
  • 172. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Manche Higher-Order Functions wie map und filter sind lazy und ¨ werden zunachst nur in die Verarbeitungs-Queue aufgenommen. Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu ¨ zwingende eager Higher Order Funktion wie reduce kommt, die ¨ ¨ naturgemaß am Ende steht und die Verarbeitung auslost. Ein Stream wird von einer Collection mit stream() oder ¨ parallelStream() ausgelost. Art of the state 58 / 98
  • 173. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Manche Higher-Order Functions wie map und filter sind lazy und ¨ werden zunachst nur in die Verarbeitungs-Queue aufgenommen. Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu ¨ zwingende eager Higher Order Funktion wie reduce kommt, die ¨ ¨ naturgemaß am Ende steht und die Verarbeitung auslost. Ein Stream wird von einer Collection mit stream() oder ¨ parallelStream() ausgelost. Bei der Parallelverarbeitung verdoppelt sich der Stream durch Zellteilung (FORK ). Art of the state 58 / 98
  • 174. Lambda Expressions in Java 8 Collections und Higher-Order Functions Higher-Order Functions Stream und Parallelisierung Ein Stream ist eine Pipeline von Higher-Order Functions, die wir mit Verhalten parametrisieren. Manche Higher-Order Functions wie map und filter sind lazy und ¨ werden zunachst nur in die Verarbeitungs-Queue aufgenommen. Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazu ¨ zwingende eager Higher Order Funktion wie reduce kommt, die ¨ ¨ naturgemaß am Ende steht und die Verarbeitung auslost. Ein Stream wird von einer Collection mit stream() oder ¨ parallelStream() ausgelost. Bei der Parallelverarbeitung verdoppelt sich der Stream durch Zellteilung (FORK ). Die Arbeitsergebnisse werden in der richtigen Reihenfolge zusammengetragen (JOIN). Art of the state 58 / 98
  • 175. Lambda Expressions in Java 8 Closures Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 59 / 98
  • 176. Lambda Expressions in Java 8 Closures Closures Definition Art of the state 60 / 98
  • 177. Lambda Expressions in Java 8 Closures Closures Definition Anonyme Funktionen wurden 1936 von Alonzo Church mit dem Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann ¨ ¨ definiert und aufgerufen werden, ohne an einen Identifier gebunden zu sein. Art of the state 60 / 98
  • 178. Lambda Expressions in Java 8 Closures Closures Definition Anonyme Funktionen wurden 1936 von Alonzo Church mit dem Λ-Kalkul eingefuhrt. Eine anonyme Funktion kann ¨ ¨ definiert und aufgerufen werden, ohne an einen Identifier gebunden zu sein. Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closure ¨ ist eine anonyme Funktion, die nicht nur Zugriff auf ihren unmittelbaren lexical scope hat, sondern auch auf das lexical environment, aus dem sie aufgerufen wird. Ihre freien Variablen werden in dem aufrufenden Kontext gebunden (closed). Daher der Name Closure. Art of the state 60 / 98
  • 179. Lambda Expressions in Java 8 Closures Closures in Programmiersprachen Die ersten Programmiersprachen mit Closures Name Jahr Autor Typisierung Paradigma Smalltalk 1972 Alan Kay, Dan Ingalls und Adele Goldberg dynamisch objektorientiert Scheme 1975 Guy L. Steele und Gerald Jay Sussman dynamisch funktional Art of the state 61 / 98
  • 180. Lambda Expressions in Java 8 Closures Closures in Programmiersprachen Die ersten Programmiersprachen mit Closures Name Jahr Autor Typisierung Paradigma Smalltalk 1972 Alan Kay, Dan Ingalls und Adele Goldberg dynamisch objektorientiert Scheme 1975 Guy L. Steele und Gerald Jay Sussman dynamisch funktional Und seitdem in vielen, vielen anderen Sprachen . . . Art of the state 61 / 98
  • 181. Lambda Expressions in Java 8 Closures Closures in Java 8 Art of the state 62 / 98
  • 182. Lambda Expressions in Java 8 Closures Closures in Java 8 Java: Closures mit anonymen Klassen Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){ public boolean test(Wahlkreis wk) { return partei.equals(wk.partei) ; } }; ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() { public int applyAsInt(Wahlkreis wk) { return wk.stimmen; } }; int sum = wahlkreise.stream() . filter ( testPartei ) .map(mapStimm).sum(); Art of the state 62 / 98
  • 183. Lambda Expressions in Java 8 Closures Closures in Java 8 Java: Closures mit anonymen Klassen Predicate<Wahlkreis> testPartei = new Predicate<Wahlkreis>(){ public boolean test(Wahlkreis wk) { return partei.equals(wk.partei) ; } }; ToIntFunction<Wahlkreis> mapStimm = new ToIntFunction<Wahlkreis>() { public int applyAsInt(Wahlkreis wk) { return wk.stimmen; } }; int sum = wahlkreise.stream() . filter ( testPartei ) .map(mapStimm).sum(); Java 8: Closures mit anonymen Funktionen int sum = wahlkreise.stream() . filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum(); Art of the state 62 / 98
  • 184. Lambda Expressions in Java 8 Closures Closures in Java 8 Funktionale Interfaces Was haben diese Interfaces gemeinsam? java.lang.Runnable java.util.concurrent.Callable java.security.PrivilegedAction java.util.Comparator java.io.FileFilter java.nio.file.PathMatcher java.lang.reflect.InvocationHandler java.beans.PropertyChangeListener java.awt.event.ActionListener javax.swing.event.ChangeListener Art of the state 63 / 98
  • 185. Lambda Expressions in Java 8 Closures Closures in Java 8 Anonyme Funktionen implementieren funktionale Interfaces Art of the state 64 / 98
  • 186. Lambda Expressions in Java 8 Closures Closures in Java 8 Anonyme Funktionen implementieren funktionale Interfaces Funktionale Interfaces deklarieren genau eine abstrakte Methode. Art of the state 64 / 98
  • 187. Lambda Expressions in Java 8 Closures Closures in Java 8 Anonyme Funktionen implementieren funktionale Interfaces Funktionale Interfaces deklarieren genau eine abstrakte Methode. Eine anonyme Funktion implementiert ein funktionales Interface. Welches, das erschließt sich aus dem Kontext. Typen mussen nicht immer angegeben werden. Der ¨ Java-Compiler lernt zunehmend Typ-Inferenz. Art of the state 64 / 98
  • 188. Lambda Expressions in Java 8 Closures Closures in Java 8 ¨ ¨ Anonyme Funktionen sind dunnhautige Chamaleons ¨ Art of the state 65 / 98
  • 189. Lambda Expressions in Java 8 Closures Closures in Java 8 ¨ ¨ Anonyme Funktionen sind dunnhautige Chamaleons ¨ Anonyme Funktionen und anonyme Klassen haben Zugriff auf effectively final Variablen des lexical environments. Art of the state 65 / 98
  • 190. Lambda Expressions in Java 8 Closures Closures in Java 8 ¨ ¨ Anonyme Funktionen sind dunnhautige Chamaleons ¨ Anonyme Funktionen und anonyme Klassen haben Zugriff auf effectively final Variablen des lexical environments. Im Gegensatz zu anonymen Klassen haben anonyme Funktionen ¨ keine eigene Identitat. Sie stehen in keiner Vererbungshierarchie, sie bringen keinen eigenen Scope mit. Selbst das Schlusselwort ¨ this ist das this ihres lexical environments. Art of the state 65 / 98
  • 191. Lambda Expressions in Java 8 Closures ¨ Zum Aufwarmen lambda-8-b117 vom 21.11.2013 import java. util .∗; import java. util . function .∗; import static java. util .stream.Collectors. toList ; List <String> worte = Arrays.asList("Wo", "ist", "meine", "Brille"); // Ausgabe [meine, Brille] show(worte.stream(). filter (p −> p.length() > 3). collect ( toList () ) ) ; // Ausgabe jedesmal [2, 3, 5, 6] Function<String, Integer> f1 = p −> p.length(); // closure Function<String, Integer> f2 = String :: length; // method reference show(worte.stream().map(f1).collect( toList () ) ) ; show(worte.stream().map(f2).collect( toList () ) ) ; List <Integer> zahlen = Arrays.asList(6, 5, 2, 3); zahlen.sort (( p1, p2) −> p1.compareTo(p2)); show(zahlen); Art of the state 66 / 98
  • 192. Lambda Expressions in Java 8 Closures Spielraum fur Parallelisierung ¨ Interne Iteration mit SQL SELECT SUM(stimmen) FROM wahlkreise WHERE partei = ’A’ Interne Iteration mit Java 8 int sum =wahlkreise.parallelStream() . filter (wk−>"A".equals(wk.partei)) . mapToInt (wk−>wk.stimmen) . sum(); Art of the state 67 / 98
  • 193. Lambda Expressions in Java 8 Closures Abfragen zur Wahl . . . lambda-8-b117 vom 21.11.2013 import java. util .∗; import java. util . function .∗; import java. util .stream.Collectors; List <Pair> quotienten = new ArrayList<>(); for ( int i = 1; i <= anzSitze; ++i) { for (Pair v : votum) { quotienten.add(new Pair(v.partei, v.zahl/ i ) ) ; } } // quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ... List <String> plazierung = quotienten.stream() .sorted((p1, p2) −> p2.zahl − p1.zahl).limit (anzSitze) .map(pair −> pair.partei) . collect (Collectors . toList () ) ; // plazierung = [A, B, A, A, B, A, B, A] Art of the state 68 / 98
  • 194. Lambda Expressions in Java 8 Closures Abfragen zur Wahl im LINQ Stil lambda-8-b117 vom 21.11.2013 import import import import java. util .∗; java. util . function .∗; java. util .stream.Collectors; static java. util .stream.Collectors.groupingBy; // quotienten = [(’ A’,10000) ,(’ B’,6000) ,(’ C’,1500) ,(’ A’,5000) ... Map<String, List<String>> parteiSitze = quotienten.stream() .sorted((p1, p2) −> p2.zahl − p1.zahl) . limit (anzSitze).map(pair −> pair.partei) . collect (groupingBy(a−>a)); // parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]} Art of the state 69 / 98
  • 195. Lambda Expressions in Java 8 Closures Codeblock in Action lambda-8-b117 vom 21.11.2013 Fur Smalltalk und Ruby-Fans. ¨ // parteiSitze ={A=[A, A, A, A, A], B=[B, B, B]} parteiSitze .entrySet() .stream(). forEach(e−>{ System.out.print(e.getKey()+":"+e.getValue().size()+" "); }) ; // A:5 B:3 Art of the state 70 / 98
  • 196. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Hu Art of the state 71 / 98
  • 197. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld HuHu Art of the state 72 / 98
  • 198. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld HuHuHu Art of the state 73 / 98
  • 199. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Die FunctionalOWL Hu Bielefeld ist in Existenznot und braucht meine Hilfe. Art of the state 74 / 98
  • 200. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Die FunctionalOWL Hu Bielefeld ist in Existenznot und braucht meine Hilfe. Ich muss sofort zum Hackerspace. Art of the state 74 / 98
  • 201. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Die FunctionalOWL Hu Bielefeld ist in Existenznot und braucht meine Hilfe. Ich muss sofort zum Hackerspace. Spliterator geht nicht, Art of the state 74 / 98
  • 202. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Die FunctionalOWL Hu Bielefeld ist in Existenznot und braucht meine Hilfe. Ich muss sofort zum Hackerspace. ¨ Spliterator geht nicht, zu wenig Assoziativitat. Art of the state 74 / 98
  • 203. Lambda Expressions in Java 8 Closures Die FunctionalOWL vom Hackerspace Bielefeld Die FunctionalOWL Hu Bielefeld ist in Existenznot und braucht meine Hilfe. Ich muss sofort zum Hackerspace. ¨ Spliterator geht nicht, zu wenig Assoziativitat. Wenn nur das Lambdagate noch offen ist . . . Art of the state 74 / 98
  • 204. Funktionale Software-Architektur und Java Funktionale Software-Architektur und Java Art of the state 75 / 98
  • 205. Funktionale Software-Architektur und Java Motivation Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 76 / 98
  • 206. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . Art of the state 77 / 98
  • 207. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . ¨ ¨ Software zu warten, bei der man nicht regelmaßig mit argerlichen ¨ Seiteneffekten zu kampfen hat, Art of the state 77 / 98
  • 208. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . ¨ ¨ Software zu warten, bei der man nicht regelmaßig mit argerlichen ¨ Seiteneffekten zu kampfen hat, Software zu testen, die nur von ihren Eingabeparametern ¨ abhangig ist, Art of the state 77 / 98
  • 209. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . ¨ ¨ Software zu warten, bei der man nicht regelmaßig mit argerlichen ¨ Seiteneffekten zu kampfen hat, Software zu testen, die nur von ihren Eingabeparametern ¨ abhangig ist, ¨ mit unveranderlichen Bausteinen zu arbeiten? Art of the state 77 / 98
  • 210. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . ¨ ¨ Software zu warten, bei der man nicht regelmaßig mit argerlichen ¨ Seiteneffekten zu kampfen hat, Software zu testen, die nur von ihren Eingabeparametern ¨ abhangig ist, ¨ mit unveranderlichen Bausteinen zu arbeiten? Aber ¨ sind nicht veranderliche Objekte ein Grundmerkmal der Objektorientierung? Art of the state 77 / 98
  • 211. Funktionale Software-Architektur und Java Motivation Motivation ¨ Ware es nicht einfacher, . . . ¨ ¨ Software zu warten, bei der man nicht regelmaßig mit argerlichen ¨ Seiteneffekten zu kampfen hat, Software zu testen, die nur von ihren Eingabeparametern ¨ abhangig ist, ¨ mit unveranderlichen Bausteinen zu arbeiten? Aber ¨ sind nicht veranderliche Objekte ein Grundmerkmal der Objektorientierung? Antwort Hmm, . . . Art of the state 77 / 98
  • 212. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Art of the state 78 / 98
  • 213. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Multicore Prozessor Architekturen verlangen neue ¨ Programmieransatze. Art of the state 78 / 98
  • 214. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Multicore Prozessor Architekturen verlangen neue ¨ Programmieransatze. Unsynchronisierte Threads fuhren zu nichtdeterministischen ¨ ¨ Programmablaufen. Art of the state 78 / 98
  • 215. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Multicore Prozessor Architekturen verlangen neue ¨ Programmieransatze. Unsynchronisierte Threads fuhren zu nichtdeterministischen ¨ ¨ Programmablaufen. Von mehreren Threads gemeinsam genutzte Daten und ¨ Ressourcen sollten unveranderlich sein, denn Synchronisation ist ¨ kompliziert und fehleranfallig. Art of the state 78 / 98
  • 216. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Multicore Prozessor Architekturen verlangen neue ¨ Programmieransatze. Unsynchronisierte Threads fuhren zu nichtdeterministischen ¨ ¨ Programmablaufen. Von mehreren Threads gemeinsam genutzte Daten und ¨ Ressourcen sollten unveranderlich sein, denn Synchronisation ist ¨ kompliziert und fehleranfallig. ¨ ¨ Losungsansatze kommen aus der funktionalen Programmierung9 . Art of the state 78 / 98
  • 217. Funktionale Software-Architektur und Java Motivation Probleme mit shared mutable state Multicore Prozessor Architekturen verlangen neue ¨ Programmieransatze. Unsynchronisierte Threads fuhren zu nichtdeterministischen ¨ ¨ Programmablaufen. Von mehreren Threads gemeinsam genutzte Daten und ¨ Ressourcen sollten unveranderlich sein, denn Synchronisation ist ¨ kompliziert und fehleranfallig. ¨ ¨ Losungsansatze kommen aus der funktionalen Programmierung9 . Dieses hervorragende Buch von Venkat ¨ Subramaniam zeigt Losungen mit Java, Groovy, Scala und Clojure. 9 Subramaniam, Venkat: Programming Concurrency on the JVM. Art of the state 78 / 98
  • 218. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state Art of the state 79 / 98
  • 219. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state StateExplosion.java public static final Map<String,Object> appState; //All Purpose Art of the state 79 / 98
  • 220. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state StateExplosion.java public static final Map<String,Object> appState; //All Purpose Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das Gegenteil von Design. Art of the state 79 / 98
  • 221. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state StateExplosion.java public static final Map<String,Object> appState; //All Purpose Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das Gegenteil von Design. Aber auch in realen Projekten finden sich oft unwartbare globale Allzweck-Datenstrukturen. Art of the state 79 / 98
  • 222. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state StateExplosion.java public static final Map<String,Object> appState; //All Purpose Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das Gegenteil von Design. Aber auch in realen Projekten finden sich oft unwartbare globale Allzweck-Datenstrukturen. Sie sind ein Zeichen mangelnder Modellierung und fehlender oder falscher Abstraktion. Art of the state 79 / 98
  • 223. Funktionale Software-Architektur und Java Motivation Probleme mit global mutable state StateExplosion.java public static final Map<String,Object> appState; //All Purpose Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist das Gegenteil von Design. Aber auch in realen Projekten finden sich oft unwartbare globale Allzweck-Datenstrukturen. Sie sind ein Zeichen mangelnder Modellierung und fehlender oder falscher Abstraktion. Der Blick durch funktionale und OO Brille. . . helfen, maßgeschneiderte Abstraktionen zu finden. Art of the state 79 / 98
  • 224. Funktionale Software-Architektur und Java Motivation Motivationsschub Art of the state 80 / 98
  • 225. Funktionale Software-Architektur und Java Motivation Motivationsschub Immutable Point class . . . @Immutable public class Point { public final int x, y; public Point( int x, int y) { this .x = x; this .y = y; } } Art of the state 80 / 98
  • 226. Funktionale Software-Architektur und Java Motivation Motivationsschub Immutable Point class . . . @Immutable public class Point { public final int x, y; public Point( int x, int y) { this .x = x; this .y = y; } } Diese Klasse ist threadsafe10 . Art of the state 80 / 98
  • 227. Funktionale Software-Architektur und Java Motivation Motivationsschub Immutable Point class . . . @Immutable public class Point { public final int x, y; public Point( int x, int y) { this .x = x; this .y = y; } } Diese Klasse ist threadsafe10 . 10 Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug; Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006. Art of the state 80 / 98
  • 228. Funktionale Software-Architektur und Java Motivation Motivationsschub Immutable Point class . . . @Immutable public class Point { public final int x, y; public Point( int x, int y) { this .x = x; this .y = y; } } Diese Klasse ist threadsafe10 . ¨ Alle unveranderlichen Klassen sind threadsafe. 10 Listing 4.6 aus Goetz, Brian; Bloch, Joshua; Bowbeer, Joseph; Lea, Doug; Holmes, David; Peierls, Tim: Java Concurrency in Practice. Addison-Wesley, 2006. Art of the state 80 / 98
  • 229. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Gliederung 1 Vorgeschichte Das Entscheidungsproblem 2 Funktionale Programmierung Einfuhrung ¨ Fraktales SQL Eine funktionale Berechnung Konzepte und Programme 3 Lambda Expressions in Java 8 Motivation Collections und Higher-Order Functions Closures 4 Funktionale Software-Architektur und Java Motivation Trennung: Schwarz und Weiß Trennung: Graustufen Art of the state 81 / 98
  • 230. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Art of the state 82 / 98
  • 231. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Wir werden hier nicht versuchen, Java zu funktionalisieren oder Java 8 Features zu simulieren. Art of the state 82 / 98
  • 232. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Wir werden hier nicht versuchen, Java zu funktionalisieren oder Java 8 Features zu simulieren. Es geht um idiomatisches, objektorientiertes Java, das auch unsere Kollegen verstehen. Art of the state 82 / 98
  • 233. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Wir werden hier nicht versuchen, Java zu funktionalisieren oder Java 8 Features zu simulieren. Es geht um idiomatisches, objektorientiertes Java, das auch unsere Kollegen verstehen. Der Blick durch die funktionale Brille . . . ¨ soll uns helfen, bessere und verstandlichere Programme zu schreiben. Art of the state 82 / 98
  • 234. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Wir werden hier nicht versuchen, Java zu funktionalisieren oder Java 8 Features zu simulieren. Es geht um idiomatisches, objektorientiertes Java, das auch unsere Kollegen verstehen. Der Blick durch die funktionale Brille . . . ¨ soll uns helfen, bessere und verstandlichere Programme zu schreiben. Nach einer kurzen Einfuhrung werfen wir einen Blick auf die ¨ ¨ einschlagige Literatur. Art of the state 82 / 98
  • 235. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Thema Wir werden hier nicht versuchen, Java zu funktionalisieren oder Java 8 Features zu simulieren. Es geht um idiomatisches, objektorientiertes Java, das auch unsere Kollegen verstehen. Der Blick durch die funktionale Brille . . . ¨ soll uns helfen, bessere und verstandlichere Programme zu schreiben. Nach einer kurzen Einfuhrung werfen wir einen Blick auf die ¨ ¨ einschlagige Literatur. Danach geht es mit Fallstudien weiter. Art of the state 82 / 98
  • 236. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Art of the state 83 / 98
  • 237. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Art of the state 83 / 98
  • 238. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Wir folgen dem Grundsatz, Logik zu zentralisieren. Art of the state 83 / 98
  • 239. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Wir folgen dem Grundsatz, Logik zu zentralisieren. ¨ Wo wir konnen, werden wir im logischen Kern unserer Programme ¨ unveranderliche Objekte und pure Methoden verwenden. Art of the state 83 / 98
  • 240. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Wir folgen dem Grundsatz, Logik zu zentralisieren. ¨ Wo wir konnen, werden wir im logischen Kern unserer Programme ¨ unveranderliche Objekte und pure Methoden verwenden. Aus der architektonischen Vogelperspektive, versteht sich. An ¨ Log-Ausgaben und Exception-Handling werden wir nichts andern. Art of the state 83 / 98
  • 241. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Wir folgen dem Grundsatz, Logik zu zentralisieren. ¨ Wo wir konnen, werden wir im logischen Kern unserer Programme ¨ unveranderliche Objekte und pure Methoden verwenden. Aus der architektonischen Vogelperspektive, versteht sich. An ¨ Log-Ausgaben und Exception-Handling werden wir nichts andern. Auch aus der Vogelperspektive werden wir darauf beharren, dass ¨ unveranderliche Objekte unmittelbar nach Durchlaufen des Konstruktors final sind. Art of the state 83 / 98
  • 242. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß In der Architektur geht es ums Trennen, wir wollen keine undifferenzierten Monolithen Wir folgen dem Grundsatz, Logik zu zentralisieren. ¨ Wo wir konnen, werden wir im logischen Kern unserer Programme ¨ unveranderliche Objekte und pure Methoden verwenden. Aus der architektonischen Vogelperspektive, versteht sich. An ¨ Log-Ausgaben und Exception-Handling werden wir nichts andern. Auch aus der Vogelperspektive werden wir darauf beharren, dass ¨ unveranderliche Objekte unmittelbar nach Durchlaufen des Konstruktors final sind. Sollte Ergebnis der Trennung sein, dass z.B. eine extrem ¨ veranderliche Komponente, durch einen endlichen Automaten zu realisieren ist, dann ist auch das eine gute Abgrenzung. Art of the state 83 / 98
  • 243. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Literaturempfehlungen Art of the state 84 / 98
  • 244. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Literaturempfehlungen Art of the state 84 / 98
  • 245. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Literaturempfehlungen Effective Java ist das eine Buch, das jeder Java Entwickler immer dabei haben sollte. Art of the state 84 / 98
  • 246. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Literaturempfehlungen Effective Java ist das eine Buch, das jeder Java Entwickler immer dabei haben sollte. Program Development in Java ist ein Klassiker der Informatikausbildung, jedoch kein Buch um Java zu lernen. Art of the state 84 / 98
  • 247. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Trennung: Schwarz und Weiß Literaturempfehlungen Effective Java ist das eine Buch, das jeder Java Entwickler immer dabei haben sollte. Program Development in Java ist ein Klassiker der Informatikausbildung, jedoch kein Buch um Java zu lernen. Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen. ¨ 11 Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns, Testen und Techniken fur sauberen Code. mitp-Verlag, 2009 ¨ Art of the state 84 / 98
  • 248. Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß Literaturstudium Effective Java Art of the state 85 / 98