Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

308
Art of the state Funktionale Softwarearchitektur mit Plain Old Java unter Jantzen Capgemini 16. Januar 2013 1 1 Angepasst an jdk8 lambda-8-b117 vom 21.11.2013 Art of the state 1 / 98

description

Präsentation für Java Usergruppe Hannover am 16.1.2013 behandelt: - Funktionale Programmierung, - Lambda Expressions in Java 8 - Funktionale Softwarearchitektur und Java

Transcript of Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Page 1: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Art of the stateFunktionale Softwarearchitektur mit Plain Old Java

Gunter Jantzen

Capgemini

16. Januar 2013 1

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

Page 2: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

1 VorgeschichteDas Entscheidungsproblem

2 Funktionale ProgrammierungEinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 2 / 98

Page 3: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeldhttp://hackerspace-bielefeld.de/

Verwendung mitfreundlicherGenehmigung desKunstlers JonahJoen Bethlehem.

Art of the state 3 / 98

Page 4: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 4 / 98

Page 5: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis.

Art of the state 5 / 98

Page 6: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

ich bin die FunctionalOWL und habe ein fotografisches Gedachtnis.

Art of the state 5 / 98

Page 7: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

Flash

Jetzt schreibt bitte mal Eure Namen auf die Liste.

Art of the state 6 / 98

Page 8: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

Jetzt schreibt bitte mal Eure Namen auf die Liste.

Art of the state 6 / 98

Page 9: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

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

Art of the state 7 / 98

Page 10: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

In der Reihenfolge, so wie ihr sitzt.

Wahrend Euch die brasige Vorgeschichte vorgelesen wird konnt ihrEuch ja schon mal uberlegen, wie sich das Aufschreibenparallelisieren lasst.Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Page 11: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

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

Aber die Reihenfolge muss stimmen!!

Art of the state 7 / 98

Page 12: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Die FunctionalOWL vom Hackerspace Bielefeld

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

Art of the state 7 / 98

Page 13: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte

Vorgeschichte

Art of the state 8 / 98

Page 14: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 9 / 98

Page 15: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa

1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htm

Art of the state 10 / 98

Page 16: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htm

Art of the state 10 / 98

Page 17: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Gullivers Reise nach Laputa1726 parodierte Swift in Gulliver’s Travels, die u.a. 1666 von Leibniz inder Ars Combinatoria formulierte Idee, auf kombinatorische Weise allemogliche Wahrheiten zu finden.

http://www.gutenberg.org/files/829/829-h/829-h.htmArt of the state 10 / 98

Page 18: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Page 19: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Page 20: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.

Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Page 21: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.

David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Page 22: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 inder Mathematik sei nicht so sehr von den Anwendungengetrieben.Sondern alle mathematischen Wahrheiten ließen sich mit finitenMethoden aus endlichen Axiomen und Regeln formalschematisch ableiten.David Hilberts Ziel waren vollstandige und widerspruchsfreieendliche Axiomenysteme fur alle mathematischen Theorien.

Art of the state 11 / 98

Page 23: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Page 24: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.

Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Page 25: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.

Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Page 26: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die Godelschen Unvollstandigkeitssatze

Das 1920 von David Hilbert formulierte Programm erlitt 1931 mitden Godelschen Unvollstandigkeitssatzen einen schwerenRuckschlag.Kurt Godel konnte zeigen, dass formale Systeme nach Art derArithmetik weder vollstandig sind, noch dass sich derenWiderspruchsfreiheit zeigen lasst.Formal lasst sich mathematische Wahrheit nur unzureichenderfassen.

Art of the state 12 / 98

Page 27: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

Page 28: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.

1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

Page 29: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Das Entscheidungsproblem

Es blieb die Frage offen, ob es ein endliches Verfahren gibt, mitdem fur eine beliebige, im formalen System der Arithmetikformulierte Aussage entschieden werden kann, ob siemathematisch wahr ist.1936 wurden bei zwei Zeitschriften unabhangig Arbeiteneingereicht, die zeigten, dass es in der Arithmetik nichtentscheidbare Probleme gibt. Diese Arbeiten legten nebenbeiGrundlagen fur die spater entstehende Informatik.

Art of the state 13 / 98

Page 30: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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 funktionalenProgrammierung ein.

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

Art of the state 14 / 98

Page 31: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 15 / 98

Page 32: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.

Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Page 33: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Page 34: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Page 35: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Vorgeschichte Das Entscheidungsproblem

Die FunctionalOWL vom Hackerspace BielefeldDie hilfreiche Eule

HuHu

Ich geb euch mal nen Tip.Wenn das Assoziativgesetz gilt, ist es ganz egal wie man dieKlammern 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

Page 36: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung

Funktionale Programmierung

Art of the state 17 / 98

Page 37: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 18 / 98

Page 38: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 39: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 40: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 41: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 42: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 43: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 44: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 45: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 46: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 47: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.

Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 48: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 49: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 50: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Hallo schone neue Welt

In der funktionalen Programmierung sind Werte unveranderlich undFunktionen keine Subroutinen, sondern mathematische Funktionen.

Es gibt keine Wertzuweisung. Variable sind nach Initialisierungunveranderlich.Funktionen sind frei von Seiteneffekten.

StopWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

WeiterWir lassen das Ratsel vorerst ungelost . . .

Art of the state 20 / 98

Page 51: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Page 52: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Page 53: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Page 54: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Page 55: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamisch

Einfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

2Bruce A. Tate.: Sieben Wochen, sieben Sprachen. O’Reilly, 2011.

Art of the state 21 / 98

Page 56: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

GeschichteEinige funktionale Sprachen

Name Jahr Autor TypisierungΛ-Kalkul 1936 Alonzo Church

Lisp 1958 John McCarthy dynamischML 1973 Robert Milner statisch

Scheme 1975 Steele / Sussman dynamischCommon Lisp 1984 Komitee dynamisch

Erlang 1986 Ericsson, Joe Armstrong dynamischHaskell 1990 Komitee statischOCaml 1996 INRIA statisch, OO

Scala 2003 Martin Odersky statisch, OOF# 2005 Microsoft, Don Syme statisch, OO

Clojure 2007 Rich Hickey dynamischEinfuhrungen zu vier Sprachen in Sieben Wochen, sieben Sprachen2

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

Page 57: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Page 58: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().

Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Page 59: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Page 60: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.

Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Page 61: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Einfuhrung

Theoretisches Intermezzo

Pure Funktion Eine Funktion heißt pur, wenn der Ruckgabewertausschließlich von den Argumenten abhangt und ohneSeiteneffekte berechnet wird.

Beispiel: sum(), max(), size().Referentielle Transparenz Ein Ausdruck heißt referentiell transparent,

wenn er durch seinen Wert ersetzt werden kann, ohnedas Verhalten des Programms zu verandern.

Bemerkung: Man ist versucht, Ketten derartiger Ausdrucke zuEinzeilern zusammenzuschieben.Das ist nicht immer eine gute Idee.

Art of the state 22 / 98

Page 62: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 23 / 98

Page 63: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Page 64: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.

Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Page 65: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLObfuscated Query contest

Selects konnenuberall Selectsenthalten und essind nur Einzeilermoglich.

Doch werdenkeine Werteverandert.Und Funktionenhaben keineSeiteneffekte.

In den Nesseln eines fraktalen Ungeheuers?

WITH LatestOrders (ID) AS (SELECT MAX(ID)FROM dbo.Orders GROUP BY CustomerID)

SELECTCustomers.∗,Orders.OrderTime AS LatestOrderTime,(SELECT COUNT(∗) FROM dbo.OrderItems

WHERE OrderID IN(SELECT ID FROM dbo.Orders WHERE

CustomerID = Customers.ID))AS TotalItemsPurchased

FROMdbo.Customers INNER JOIN dbo.Orders

ON Customers.ID = Orders.CustomerIDWHERE

Orders.ID IN (SELECT ID FROM LatestOrders)

www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspxArt of the state 24 / 98

Page 66: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLNicht das schrecklichste Ungeheuer der Meere

http://commons.wikimedia.org/wiki/File:Millepora_fire_coral.JPG

Art of the state 25 / 98

Page 67: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Page 68: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.

Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Page 69: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.

Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Page 70: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.

Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Page 71: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in Inserts

Art of the state 26 / 98

Page 72: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Fraktales SQLFazit

Verschachtelte Selects sind nicht schon. Sprachliche Mittel zumEntflechten waren wunschenswert. Doch die Vorteile des funktionalenDesigns sind sichtbar:

Aufgrund des funktionalen Aufbaus sind verschachtelte Selectswartbarer als etwa C-Einzeiler.Einbetten benutzerdefinierter purer (seiteneffektfreier) Funktionenals Stored Procedures ist moglich.Zwischen lesenden und schreibenden Zugriffen in SQL bestehteine klare Trennung.Selbst in Updates3 besteht der großte Teil der Syntax aus Selects.

3und gelegentlich auch in InsertsArt of the state 26 / 98

Page 73: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Page 74: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Page 75: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Page 76: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Fraktales SQL

Persistente DatenstrukturenBausteine der Funktionalen Programmierung sind unveranderlicheDatenstrukturen.

FrageIst es nicht eine unglaubliche Ressourcenverschwendung, bei jederAnderung eine neue Collection anlegen zu mussen?

AntwortAus der Verwendung unveranderlicher Bausteine entstehen ganzneue Moglichkeiten der Wiederverwendung.

Persistente Datenstruktur Der Begriff hat nichts mit Datenbanken zutun. Persistente Datenstrukturen erhalten bei Anderungendie vorherige Version, speichern jeweils nur die Differenzund sind damit im Effekt unveranderlich.

Art of the state 27 / 98

Page 77: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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; }

}4Figure 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

Page 78: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 29 / 98

Page 79: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

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

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Page 80: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

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

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Page 81: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale Berechnungd’hondtsches Hochstzahlverfahren

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

Die Stimmen der Parteien werden durch eine Folge von Divisorengeteilt. Die Sitze werden in der Reihenfolge der großten sichergebenen Hochstzahlen zugeteilt.5

Den Sonderfall Stimmengleichheit beim letzten Sitzvernachlassigen wir.

5Zahlenbeispiel und weitere Erlauterungen siehe: www.bundeswahlleiter.de/de/glossar/texte/d_Hondtsche_Sitzverteilung.html

Art of the state 30 / 98

Page 82: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1

1.

10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 83: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1

1.

10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 84: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000

2.

6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 85: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002

3.

5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 86: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000

5.

3000 7503

4.

3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 87: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000

5.

3000 7503 4. 3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 88: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004

6.

2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 89: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004 6. 2500 1500 3755

7.

2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 90: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333

8.

2000 5004 6. 2500 1500 3755 7. 2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 91: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000 15002 3. 5000 5. 3000 7503 4. 3333 8. 2000 5004 6. 2500 1500 3755 7. 2000 1200 3006 1667 1000 2507 1429 857 2148 1250 750 188

Sitze

5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 92: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000

1500

2 3. 5000 5. 3000

750

3 4. 3333 8. 2000

500

4 6. 2500

1500 375

5 7. 2000

1200 300

6

1667 1000 250

7

1429 857 214

8

1250 750 188

Sitze 5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 93: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungAm WahlabendDer NDR-Reporter hat schon ein Excelsheet mit ersten Auswertungenvorliegen.

Zuteilung von 8 SitzenTeiler Partei A Partei B Partei C

1 1. 10000 2. 6000

1500

2 3. 5000 5. 3000

750

3 4. 3333 8. 2000

500

4 6. 2500

1500 375

5 7. 2000

1200 300

6

1667 1000 250

7

1429 857 214

8

1250 750 188

Sitze 5 3 0

Alles wartet gespannt auf das amtliche Ergebnis aus dem funktionalenProgrammierstudio.

Art of the state 31 / 98

Page 94: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

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

Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Page 95: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

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

Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Page 96: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Page 97: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Page 98: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Eine funktionale Berechnung

Eine funktionale BerechnungSchritt fur Schritt

Das Wahlergebnis votum liegt als Liste von Paaren (p, v) vor:[(A, 10000), (C, 1500), (B, 6000)]. Es sind sitze = 8 Sitze zuvergeben.Bilde neue Liste quotienten der Paare (p, vi ) mit (p, v) aus votumund i aus 1, 2, ..sitze:[(A, 10000), (B, 6000), (C, 1500) . . . (A, 1250), (B, 750), (C, 188)].Sortiere quotienten absteigend nach der zweiten Komponente undnehme 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 diePartei-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 Aerhalt 5 Sitze, Partei B erhalt 3 Sitze, Partei C bleibt draußen.

Art of the state 32 / 98

Page 99: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 33 / 98

Page 100: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Page 101: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,

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

Page 102: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Page 103: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Page 104: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Page 105: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

First-Class Functions

Die funktionale Berechnung des Wahlergebnis lasst sich mit jederProgrammiersprache 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 ubergebenwerden,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

Page 106: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

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

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Page 107: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

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

compose f ◦ g ist die Funktion, mit x 7→ f(g(x) fur alle x.

map map(f, seq) erstellt eine neue Sequenz durch Anwendungder Funktion f auf alle Elemente von seq.

filter filter(test, seq) erstellt eine neue Sequenz, die nur nochdie Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Page 108: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

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

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur nochdie Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Page 109: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

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

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Page 110: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsErklarung und Beispiele

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

compose f ◦ g ist die Funktion, mit x 7→ 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 filter(test, seq) erstellt eine neue Sequenz, die nur noch

die Elemente von seq enthalt, fur die die boolescheFunktion test zutrifft.

reduce, fold reduce(f, seq) wendet die binare Funktion f fortlaufendauf eine Sequenz an und liefert einen einzelnen Wertzuruck.

So ist map(upper, ”Hu”) = ”HU”, filter(istGerade, [1, 2, 3, 4]) = [2, 4],filter(not ◦ istGerade, [1, 2, 3, 4]) = [1, 3], reduce(add, [1, 2, 3, 4]) = 10.

Art of the state 35 / 98

Page 111: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Page 112: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Page 113: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsWeitere BeispieleIn 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

6Haverbeke, Marijn: Eloquent JavaScript : A Modern Introduction to Programming.1. Aufl.. No Starch Press, 2011.

Art of the state 36 / 98

Page 114: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order Functionsim 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 prueftfunction 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] = 5for each (var p in [’A’, ’B’, ’C’]) {

document.write(p + ’:’ + sitzliste (p). length+ ’ ’)}

Art of the state 37 / 98

Page 115: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Higher Order FunctionsComprehensions

Statt map und filter werden gerne List Comprehensions genommen.Als Bonus erhalt man noch ein ein einfaches Pattern Matching.

list-comprehension.jsvar 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

Page 116: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 117: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Lazy EvaluationGenerator Expressions in JavaScript 1.8 erlauben Lazy Evaluation.

/∗∗ script type =”application / javascript ;version=1.8 ∗∗/

// ALLE natuerlichen Zahlenfunction nat() {

var i = 0;while (true) {

yield i ;i+=1;

}}

// ALLE Zahlen , deren Quadrate groesser als 1000 sindvar q1000 = (i for each (i in nat() ) if ( i∗ i > 1000));

// Die erste Zahl, deren Quadrat groesser als 1000 ist, ist 32document.write(q1000.next())

Art of the state 40 / 98

Page 118: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonSeiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for GreatGood von Miran Lipovaca7 und ist auch online verfugbar.http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

Das Buch ist unbedingt empfehlenswert.

7Lipovaca, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.Aufl.. No Starch Press, 2011.

Art of the state 41 / 98

Page 119: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonSeiltanzer Pierre

Dieses Beispiel kommt aus dem Buch Learn you a Haskell for GreatGood von Miran Lipovaca7 und ist auch online verfugbar.http://learnyouahaskell.com/a-fistful-of-monads#walk-the-line

Das Buch ist unbedingt empfehlenswert.

7Lipovaca, Miran: Learn You a Haskell for Great Good! : A Beginner’s Guide. 1.Aufl.. No Starch Press, 2011.

Art of the state 41 / 98

Page 120: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Page 121: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Page 122: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Page 123: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

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

Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Page 124: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

Pierre ist ein guter Seiltanzer, aber er hat mit einem Seiteneffekt zukampfen.

Vogel auf derBalancierstange!

Wenn auf einer Seite der Stange zu viele Vogel landen, fallt Pierreins Netz. Der Unterschied darf hochstens drei sein.Ein Haskell-Programm soll nach erfolgreichem Seilgang denVogelstand als Zahlenpaar zuruckgeben. Bei Absturz: Nothing.

Art of the state 42 / 98

Page 125: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

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

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Page 126: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

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

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Page 127: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

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

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Page 128: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

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

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Page 129: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonVogel auf der Balancierstange

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

Pierre1.hsroutine :: Maybe Poleroutine = case landLeft 1 (0,0) of

Nothing −> NothingJust pole1 −> case landRight 4 pole1 of

Nothing −> NothingJust pole2 −> case landLeft 2 pole2 of

Nothing −> NothingJust 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

Page 130: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in Haskell

Weder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

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

>>= landLeft 1

Art of the state 44 / 98

Page 131: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in HaskellWeder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

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

>>= landLeft 1

Art of the state 44 / 98

Page 132: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonKontrollierter Umgang mit Seiteneffekten in HaskellWeder Haskell noch Pierre lassen sich aus der Ruhe bringen.

Pierre2.hsroutine2 :: Maybe Poleroutine2 = do

start <− return (0, 0)pole0 <− landLeft 1 startpole1 <− landRight 4 pole0pole2 <− landLeft 2 pole1landLeft 1 pole2

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

>>= landLeft 1

Art of the state 44 / 98

Page 133: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Das programmierbare SemikolonWas war jetzt der Trick mit der Banane?

type Birds = Inttype Pole = (Birds, Birds)

landLeft :: Birds −> Pole −> Maybe PolelandLeft n ( left , right )| abs (( left + n) − right ) < 4 = Just ( left + n, right )| otherwise = Nothing

landRight :: Birds −> Pole −> Maybe PolelandRight n ( left , right )| abs ( left − ( right + n)) < 4 = Just ( left , right + n)| otherwise = Nothing

banana :: Pole −> Maybe Polebanana = Nothing

Art of the state 45 / 98

Page 134: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Page 135: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Page 136: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die Antwort auf eine andere offene Frage

FrageWie soll man ein Hello World Programm ohne Seiteneffekte schreiben?

AntwortDas geht nicht, aber die funktionale Programmierung verfugt uberMittel und Wege, Seiteneffekte zu kontrollieren.

Art of the state 46 / 98

Page 137: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 47 / 98

Page 138: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

Na, habt ihrs rausgefunden?

Richtig, jede Reihe kann einen eigenen Zettel ausfullen.Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.Nachstes Mal!

Art of the state 48 / 98

Page 139: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

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

Die ausgefullten Listen konnt ihr dann in der richtigen Reihenfolgezusammenheften.Nachstes Mal!

Art of the state 48 / 98

Page 140: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

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

Nachstes Mal!

Art of the state 48 / 98

Page 141: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Programmierung Konzepte und Programme

Die FunctionalOWL vom Hackerspace BielefeldDie schlaue Eule

HuHu

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

Art of the state 48 / 98

Page 142: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8

Lambda Expressions in Java 8

Art of the state 49 / 98

Page 143: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 50 / 98

Page 144: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Page 145: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Page 146: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Page 147: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Externe Iterationint sum = 0;for (Wahlkreis wk : wahlkreise) {

if ( partei .equals(wk.partei)) {sum += wk.stimmen;

}}

FrageWo ist hier noch Spielraum?

Art of the state 51 / 98

Page 148: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

Collections sind ein idealer Kandidat fur parallele Verarbeitung.

Logik gehort in die Library (vgl. SQL)

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Page 149: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Page 150: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Page 151: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Page 152: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Motivation

Probleme mit den CollectionsBibliotheken brauchen Spielraum fur Parallelisierung

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

Problem externe IterationSequentielle Iteration gibt keinen Spielraum fur Parallelisierung.

Problem KompatibilitatMan kann nicht so ohne weiteres die Libraries andern.

LosungJava Language Architect Brian Goetz und sein Team haben daher dieSprache Java geandert.

Art of the state 52 / 98

Page 153: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 53 / 98

Page 154: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Page 155: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Page 156: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Page 157: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Page 158: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Abwartskompatibler Warp-Antrieblambda-8-b117 vom 21.11.2013

java/util/Collection.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , 0);}

java/util/List.java@Overridedefault Spliterator<E> spliterator() {

return Spliterators . spliterator ( this , Spliterator .ORDERED);}

Aha, polymorphe Default Implemetierung in Interfaces und . . .

SPLITERATOR

Art of the state 54 / 98

Page 159: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Disclaimer

Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zuklaren, andere konnen das besser. Insbesondere verweise ich aufMaurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen vonBrian 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

Page 160: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Disclaimer

Ich werde gar nicht erst den Versuch machen, diese Einzelheiten zuklaren, andere konnen das besser. Insbesondere verweise ich aufMaurice Naftalin’s Lambda FAQ und die DEVOXX Prasentationen vonBrian 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

Page 161: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Page 162: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Page 163: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream in Action

Parametrisierung mit anonymen Klassenint 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();}

8Cannot refer to a non-final variable partei inside an inner class defined in adifferent method

Art of the state 56 / 98

Page 164: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Page 165: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Page 166: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.

Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Page 167: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.

Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Page 168: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order Functionsin 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-OrderFunctions moglich.Anonyme Klassen sind jedoch absolute Holzklasse.Wir werden bald was besseres haben . . .

Art of the state 57 / 98

Page 169: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

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

Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 170: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

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

Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 171: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

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

Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 172: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.

Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 173: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).

Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 174: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Collections und Higher-Order Functions

Higher-Order FunctionsStream und Parallelisierung

Ein Stream ist eine Pipeline von Higher-Order Functions, die wirmit Verhalten parametrisieren.Manche Higher-Order Functions wie map und filter sind lazy undwerden zunachst nur in die Verarbeitungs-Queue aufgenommen.Die Verarbeitung wird erst dann ausgefuhrt, wenn eine dazuzwingende eager Higher Order Funktion wie reduce kommt, dienaturgemaß am Ende steht und die Verarbeitung auslost.Ein Stream wird von einer Collection mit stream() oderparallelStream() ausgelost.Bei der Parallelverarbeitung verdoppelt sich der Stream durchZellteilung (FORK ).Die Arbeitsergebnisse werden in der richtigen Reihenfolgezusammengetragen (JOIN).

Art of the state 58 / 98

Page 175: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 59 / 98

Page 176: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Page 177: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Page 178: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

ClosuresDefinition

Anonyme Funktionen wurden 1936 von Alonzo Church mit demΛ-Kalkul eingefuhrt. Eine anonyme Funktion kanndefiniert und aufgerufen werden, ohne an einen Identifiergebunden zu sein.

Closures wurden 1964 von Peter J. Landin eingefunrt. Ein Closureist eine anonyme Funktion, die nicht nur Zugriff auf ihrenunmittelbaren lexical scope hat, sondern auch auf daslexical environment, aus dem sie aufgerufen wird. Ihrefreien Variablen werden in dem aufrufenden Kontextgebunden (closed). Daher der Name Closure.

Art of the state 60 / 98

Page 179: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closuresin Programmiersprachen

Die ersten Programmiersprachen mit Closures

Name Jahr Autor Typisierung Paradigma

Smalltalk 1972Alan Kay, Dan Ingalls

dynamischobjekt-

und Adele Goldberg orientiert

Scheme 1975Guy L. Steele und

dynamisch funktionalGerald Jay Sussman

Und seitdem in vielen, vielen anderen Sprachen . . .

Art of the state 61 / 98

Page 180: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closuresin Programmiersprachen

Die ersten Programmiersprachen mit Closures

Name Jahr Autor Typisierung Paradigma

Smalltalk 1972Alan Kay, Dan Ingalls

dynamischobjekt-

und Adele Goldberg orientiert

Scheme 1975Guy L. Steele und

dynamisch funktionalGerald Jay Sussman

Und seitdem in vielen, vielen anderen Sprachen . . .

Art of the state 61 / 98

Page 181: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8

Java: Closures mit anonymen KlassenPredicate<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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Page 182: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Java: 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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Page 183: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Java: 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 Funktionenint sum = wahlkreise.stream()

. filter (wk−>partei.equals(wk.partei)).map (wk −>wk.stimmen).sum();

Art of the state 62 / 98

Page 184: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Funktionale Interfaces

Was haben diese Interfaces gemeinsam?java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListener

Art of the state 63 / 98

Page 185: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Page 186: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Page 187: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme 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. DerJava-Compiler lernt zunehmend Typ-Inferenz.

Art of the state 64 / 98

Page 188: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

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

Art of the state 65 / 98

Page 189: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

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

Im Gegensatz zu anonymen Klassen haben anonyme Funktionenkeine eigene Identitat. Sie stehen in keiner Vererbungshierarchie,sie bringen keinen eigenen Scope mit. Selbst das Schlusselwortthis ist das this ihres lexical environments.

Art of the state 65 / 98

Page 190: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Closures in Java 8Anonyme Funktionen sind dunnhautige Chamaleons

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

Art of the state 65 / 98

Page 191: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Zum Aufwarmenlambda-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(); // closureFunction<String, Integer> f2 = String :: length; // method referenceshow(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

Page 192: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Spielraum fur Parallelisierung

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

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

Art of the state 67 / 98

Page 193: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

Page 194: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Abfragen zur Wahl im LINQ Stillambda-8-b117 vom 21.11.2013

import java. util .∗;import java. util . function .∗;import java. util .stream.Collectors;import 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

Page 195: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Codeblock in Actionlambda-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

Page 196: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

Hu

Art of the state 71 / 98

Page 197: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHu

Art of the state 72 / 98

Page 198: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace Bielefeld

HuHuHu

Art of the state 73 / 98

Page 199: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Page 200: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Page 201: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Page 202: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Page 203: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Lambda Expressions in Java 8 Closures

Die FunctionalOWL vom Hackerspace BielefeldDie 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

Page 204: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java

FunktionaleSoftware-Architektur und Java

Art of the state 75 / 98

Page 205: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 76 / 98

Page 206: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .

Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 207: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,

Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 208: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,

mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 209: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 210: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 211: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivation

Ware es nicht einfacher, . . .Software zu warten, bei der man nicht regelmaßig mit argerlichenSeiteneffekten zu kampfen hat,Software zu testen, die nur von ihren Eingabeparameternabhangig ist,mit unveranderlichen Bausteinen zu arbeiten?

Abersind nicht veranderliche Objekte ein Grundmerkmal derObjektorientierung?

AntwortHmm, . . .

Art of the state 77 / 98

Page 212: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Page 213: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.

Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Page 214: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.

Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Page 215: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.

Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Page 216: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.

Art of the state 78 / 98

Page 217: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit shared mutable state

Multicore Prozessor Architekturen verlangen neueProgrammieransatze.Unsynchronisierte Threads fuhren zu nichtdeterministischenProgrammablaufen.Von mehreren Threads gemeinsam genutzte Daten undRessourcen sollten unveranderlich sein, denn Synchronisation istkompliziert und fehleranfallig.Losungsansatze kommen aus der funktionalen Programmierung9.

Dieses hervorragende Buch von VenkatSubramaniam zeigt Losungen mit Java, Groovy,Scala und Clojure.

9Subramaniam, Venkat: Programming Concurrency on the JVM.Art of the state 78 / 98

Page 218: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 219: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 220: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.

Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 221: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.

Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 222: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 223: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Probleme mit global mutable state

StateExplosion.javapublic static final Map<String,Object> appState; //All Purpose

Zugegeben, dieses Beispiel ist eine Zuspitzung. Es ist dasGegenteil von Design.Aber auch in realen Projekten finden sich oft unwartbare globaleAllzweck-Datenstrukturen.Sie sind ein Zeichen mangelnder Modellierung und fehlender oderfalscher Abstraktion.

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

Art of the state 79 / 98

Page 224: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Page 225: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Page 226: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Page 227: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Page 228: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Motivation

Motivationsschub

Immutable Point class . . .@Immutablepublic 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.

10Listing 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

Page 229: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 81 / 98

Page 230: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 231: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

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

Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 232: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 233: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 234: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.

Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 235: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Thema

Wir werden hier nicht versuchen, Java zu funktionalisieren oderJava 8 Features zu simulieren.Es geht um idiomatisches, objektorientiertes Java, das auchunsere 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 dieeinschlagige Literatur.Danach geht es mit Fallstudien weiter.

Art of the state 82 / 98

Page 236: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 237: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten Monolithen

Wir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 238: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.

Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 239: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.

Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 240: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.

Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 241: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.

Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 242: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und Weiß

In der Architektur geht es ums Trennen, wir wollen keineundifferenzierten MonolithenWir folgen dem Grundsatz, Logik zu zentralisieren.Wo wir konnen, werden wir im logischen Kern unserer Programmeunveranderliche Objekte und pure Methoden verwenden.Aus der architektonischen Vogelperspektive, versteht sich. AnLog-Ausgaben und Exception-Handling werden wir nichts andern.Auch aus der Vogelperspektive werden wir darauf beharren, dassunveranderliche Objekte unmittelbar nach Durchlaufen desKonstruktors final sind.Sollte Ergebnis der Trennung sein, dass z.B. eine extremveranderliche Komponente, durch einen endlichen Automaten zurealisieren ist, dann ist auch das eine gute Abgrenzung.

Art of the state 83 / 98

Page 243: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Page 244: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Page 245: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

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

Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Page 246: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.

Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Page 247: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Trennung: Schwarz und WeißLiteraturempfehlungen

Effective Java ist das eine Buch, das jeder Java Entwickler immerdabei haben sollte.Program Development in Java ist ein Klassiker derInformatikausbildung, jedoch kein Buch um Java zu lernen.Clean Code11 hat zum Thema leider uberhaupt nichts zu sagen.

11Martin, Robert C.: Clean Code - Deutsche Ausgabe : Refactoring, Patterns,Testen und Techniken fur sauberen Code. mitp-Verlag, 2009

Art of the state 84 / 98

Page 248: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective Java

Effective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 249: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.

Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 250: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,

weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 251: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).

Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 252: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.

Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 253: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.

Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 254: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Effective JavaEffective Java12 behandelt unser Thema in Item15: Minimizemutability ausfuhrlich, nimmt es aber auch in anderen Abschnittenimmer wieder auf, etwa bei der Behandlung des Builder Patterns.Bloch empfiehlt die Verwendung unveranderlicher Objekte, weilsie einfach und threadsafe sind,weil sie großartige Bausteine sind, die von anderen Objektengemeinsam genutzt werden konnen (shared freely ).Das einzige Problem ist, dass fur jeden einzelnen Wert ein neuesObjekt angelegt werden muss.Bloch empfiehlt bei performance Problemen eine veranderlichecompanion class, etwa StringBuilder als Helfer fur String.Der Empfehlung, dass von unveranderlichen Klassen nicht geerbtwerden darf, folge ich nicht.

12Bloch, Joshua: Effective Java (2nd Edition) (The Java Series) (2 ed.). PrenticeHall PTR, 2008.

Art of the state 85 / 98

Page 255: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 256: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.

Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 257: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.

Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 258: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 259: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln?

Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 260: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Literaturstudium Program Development in Java13

In Program Development in Java empfiehlt Barbara Liskov dieImplementierung unveranderlicher Objekte, wenn die Werte imAnwendungsbereich unveranderlich sind, oder gemeinsamnutzbare Bausteine eine effiziente Implementation ermoglichen.Es wird rigoros verlangt, dass zu jeder Methode Vorbedingung(REQUIRES), Nachbedingung (EFFECTS) und Anderungen(MODIFIES) am Objekt oder Parametern zu dokumentieren sind.Abstraction Function und Klasseninvariante sind zuimplementieren. Die Klasseninvariante ist nach jeder Anderung zuuberprufen. (Bei unveranderlichen Objekten nur im Konstruktor).

FrageHaltet ihr euch an diese wichtigen Regeln? Konnte die Ursache einigerProbleme die Komplexitat der mutablen OO sein?

13Barbara Liskov with John Guttag: Program Development in Java : Abstraction,Specification, and Object-Oriented Design. 1. Aufl.. Addison-Wesley Prof., 2000.

Art of the state 86 / 98

Page 261: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.

Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 262: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.

Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 263: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.

Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 264: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.

Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 265: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.

Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 266: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 267: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 268: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Ist ein Quadrat ein RechteckDas Liskovsche Substitutionsprinzip

Nach dem Liskovschen Substitutionsprinzip hat eine Unterklassedie Spezifikation der Klasse zu erfullen.Denn es kann sein, dass diese Unterklasse in Client-Codeverwendet wird, der keine Kenntnis von ihr hat.Fur die Klasse Rechteck seien Setter fur beide Seiten spezifiziert.Eine Unterklasse Quadrat hat diese Spezifikation zu erfullen.Bei jedem Setter-Aufruf wird aber ihre eigene Klasseninvariante(quadratisch zu sein) verletzt und eine Exception ausgelost.Das Quadrat ist also effektiv unveranderlich und die Spezifikationist zu uberarbeiten.

Der Blick durch die funktionale BrilleDie Intention des Anwenders laßt sich manchmal mit unveranderlichenKlassen naturlicher realisieren.

Art of the state 87 / 98

Page 269: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 270: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.

Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 271: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).

Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 272: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.

Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 273: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 274: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieKonvertierung elektronischer Bilanzen

Fur die Konvertierung elektronischer Bilanzen aus demXBRL-Format wurde in Java eine Rule-Engine entwickelt.Zur Konfiguration verwendeten wir eine funktionale DSL (in XML).Erst wahrend der Entwicklung wurde die Anforderung formuliert,die Berechnung revisionssicher zu dokumentieren.Aufgrund des funktionalen Entwurfs waren Rechenweg und alleZwischenergebnisse schon im Ausgabeformat enthalten.

Der Blick durch die funktionale Brillehilft uns, den Daten- und Kontrollfluss zu strukturieren und besser zuverstehen.

Art of the state 88 / 98

Page 275: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Page 276: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Page 277: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494

http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Page 278: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

Albrecht Durer: “Mein Agnes”, 1494http://de.wikipedia.org/wiki/Agnes_D%C3%BCrer

Wird beim Malen oder Zeichnennicht zu viel verandert, erhaltman eine Vorstellung vomHerstellungsprozess.

Noch offensichtlicher wird das beiZeichnungen aus einem Strich,wie z.B. Picassos Friedenstaube.

Art of the state 89 / 98

Page 279: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?

Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 280: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.

Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 281: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.

Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 282: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.

Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 283: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 284: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Schwarz und Weiß

FallstudieQualen des Sax-Parsens

Wer parst heute noch XML, und dann noch mit Sax-Parser?Mancher hat es schon immer gehasst, das fremdbestimmteReagieren auf eine unaufhorliche Folge von Ereignissen:Tag auf: Name Attribute, Text, Tag zu: Name.Mir war damals jedoch der DOM-Parser zuwider und seinmutabler All-Purpose Baum mit diesen unzahligen Achsen.Der Witz des Sax-Parsens besteht darin, die Ereignisse zunachstnur zu filtern und einzusammeln.Um sie dann in schlanke, maßgeschneiderte, unveranderlicheDatenstrukturen umzutopfen.

Der Blick durch die funktionale BrilleArbeitsteilung und “Umtopfen” schafft Unabhangigkeit und Struktur.

Art of the state 90 / 98

Page 285: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Gliederung1 Vorgeschichte

Das Entscheidungsproblem2 Funktionale Programmierung

EinfuhrungFraktales SQLEine funktionale BerechnungKonzepte und Programme

3 Lambda Expressions in Java 8MotivationCollections und Higher-Order FunctionsClosures

4 Funktionale Software-Architektur und JavaMotivationTrennung: Schwarz und WeißTrennung: Graustufen

Art of the state 91 / 98

Page 286: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.

In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Page 287: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.

Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Page 288: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.

Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Page 289: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.

Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Page 290: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Trennung: GraustufenIn der Trennung Schwarz-Weiß haben wir den Logik-Kern inveranderliche und unveranderliche Objekte aufgetrennt.In der Trennung Graustufen versuchen wir die verbleibendenveranderlichen Objekte so auszudifferenzieren, dass sie minimaleKonfusion und Schaden anrichten.Auf bekannte Techniken der Schadensbegrenzung, wieBeschrankung des Scopes, defensive Kopien, Test,Dokumentation und Absicherung von Invarianten (assert) werdeich nicht weiter eingehen.Funktionen mit Seiteneffekten konnen nutzliche strukturelleEigenschaften besitzen. Ist die Funktion ohne Muhe invertierbar,so lasst sich z.B. leicht eine Undo-Funktionalitat realisieren, ohnedie Historie verwalten zu mussen.Ich mochte hier noch eine weitere Moglichkeit der strukturellenDifferenzierung vorstellen.

Art of the state 92 / 98

Page 291: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Page 292: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.

Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Page 293: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.

Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Page 294: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.

Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Page 295: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

Idempotente Funktionen

Idempotent Eine Funktion, fur die gilt f(f(x)) = f(x) fur alle x, heißtidempotent. Im Klartext, ob die Funktion einmal odermehrmals aufgerufen wird, andert nichts am Ergebnis.

Ein SQL-Update kann mehrfach hintereinander ausgefuhrtwerden, ohne dass sich das Ergebnis andert.Auch eine Funktion, die Werte an den Ecken oder Kanten einesBaumes andert, ist idempotent.Ein SQL-Insert ist nicht idempotent, eine geeignete Unique KeyConstraint kann aber ggf. Schaden abwenden.Das Entfernen des außersten rechten Astes eines Baumes istnicht idempotent, und kann betrachtlichen Schaden anrichten,wenn die Funktion versehentlich mehrfach aufgerufen wird.

Art of the state 93 / 98

Page 296: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.

Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 297: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.

Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 298: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.

In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 299: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 300: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 301: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Funktionale Software-Architektur und Java Trennung: Graustufen

FallstudieIdempotente Funktionen in der Praxis

Eine Folge von Updates ist leichter im Arbeitsspeicher zu halten,als eine Folge von Inserts.Es ist einfacher, eine Baumstruktur aufzubauen, zu traversierenund einzelne Werte abzuandern, als den Baum strukturell zuverandern.Wenn unsere Methoden in einem Framework mehrfachaufgerufen werden, ist es sinnvoll Schutzmaßnahmen zu treffen.In der Batchverarbeitung konnen wir glucklich sein, wennidempotent geschrieben wird. Sonst haben wir im FehlerfallProbleme, an der richtigen Stelle wieder aufzusetzen.

Der Blick durch die funktionale Brillezeigt, dass nicht nur pure Funktionen nutzliche Eigenschaften haben.Wenn wir umgekehrt sehen, dass die Spezifikation strukturelleUberraschungen enthalt, sollte fruhzeitig daruber geredet werden.

Art of the state 94 / 98

Page 302: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Page 303: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Mu

tabor

Art of the state 95 / 98

Page 304: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Page 305: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Muta

bor

Art of the state 95 / 98

Page 306: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Art of the state 96 / 98

Page 307: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Art of the state 97 / 98

Page 308: Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

Am Lambdagate

Art of the state 98 / 98