Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

873 views

Published on

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

Published in: Technology
5 Comments
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
873
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
11
Comments
5
Likes
0
Embeds 0
No embeds

No notes for slide

Art of the state - Funktionale Softwarearchitektur mit Plain Old Java

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

×