1
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
JVM Functional
Language Battle
1.0
JVM Functional Language Battle© Orientation in Objects GmbH
Ihr Sprecher
Architektur
Agile Softwareentwicklung
Codequalität
Trainer, Berater, Entwickler
Falk Sippach (@sippsack)
2
Co-Organisator
2
JVM Functional Language Battle© Orientation in Objects GmbH
Java, XML und Open Source seit 1998
) Competence Center)) Object Rangers )
• Schulungen, Coaching,
Weiterbildungsberatung,
Train & Solve-Programme
• Methoden, Standards und
Tools für die Entwicklung
von offenen, unternehmens-
weiten Systemen
• Unterstützung laufender
Java Projekte
• Perfect Match
• Rent-a-team
• Coaching on the project
• Inhouse Outsourcing
• Schlüsselfertige Realisierung
von Java Software
• Individualsoftware
• Pilot- und Migrationsprojekte
• Sanierung von Software
• Software Wartung
) Software Factory )
3
JVM Functional Language Battle© Orientation in Objects GmbH
Abstract
4
Funktionale Programmierung soll so viel ausdrucksstärker sein, aber
leider ist dieses Programmier-Paradigma nicht ganz kompatibel zu der
prozedural- und objektorientierten Denkweise von uns Java-Entwicklern.
Anhand eines kleinen Algorithmus werden wir uns verschiedene Lösungen
zunächst im klassischem imperativen Java (vor Java 8) und als Vergleich
dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw.
JavaScript) anschauen und die verschiedenen Lösungen diskutieren.
Herauskommen soll eine saubere und verständlichere Struktur, die zu
besser les- und wartbarem Code führen wird. Die gewonnenen
Erkenntnisse wollen wir dann letztendlich in Java 8 mittels Streams und
Lambda-Ausdrücken umsetzen, so dass jeder Zuhörer die Grundideen der
funktionalen Programmierung mit in seine tägliche Arbeit nehmen kann.
Es sind keine speziellen Vorkenntnisse in den angesprochenen
alternativen Sprachen notwendig, ein solides Verständnis für die
Programmiersprache Java genügt.
3
JVM Functional Language Battle© Orientation in Objects GmbH
Gliederung
• Warum von Imperativ zu Funktional?
• Sprachwettkampf
• Functional Java 8+
5
JVM Functional Language Battle© Orientation in Objects GmbH 6
Java
Groovy
Haskell
ScalaClojure
Frege
FunktionalImperativ
4
JVM Functional Language Battle© Orientation in Objects GmbH 7
Foto von Mohamed Nuzrath, CC0 Public Domain Lizenz,
https://pixabay.com/de/kick-martial-arts-krieger-185384/
Foto von tomwieden, CC0 Public Domain Lizenz,
https://pixabay.com/de/boule-kugeln-spielen-frankreich-141004/
Imperativ:
Wie erreiche
ich mein Ziel?
Funktional:
Was will ich
erreichen?
JVM Functional Language Battle© Orientation in Objects GmbH 8
Problemstellung
Foto von Manfred Antranias Zimmer, CC0 Public Domain Lizenz, https://pixabay.com/de/aussichtspunkt-fernrohr-ferne-sicht-1021337/
5
JVM Functional Language Battle© Orientation in Objects GmbH 9
Foto von Media Publishing, CC0 Public Domain Lizenz, https://pixabay.com/de/kreditkarte-kredit-karte-bank-geld-1680347/
JVM Functional Language Battle© Orientation in Objects GmbH 10
Luhn-Algorithmus
Luhn-Formel
"Modulo 10"-Algorithmus
Double-Add-Double-Methode
Prüfsummen-Berechnung
rein clientseitige
Prüfung möglich
6
JVM Functional Language Battle© Orientation in Objects GmbH 11
Beispiel
47163471848629614 7 1 6 3 4 7 1 8 4 8 6 2 9 6 1
1 6 9 2 6 8 4 8 1 7 4 3 6 1 7 4
1 12 9 4 6 16 4 16 1 14 4 6 6 2 7 8
1 1 2 9 4 6 1 6 4 1 6 1 1 4 4 6 6 2 7 8
1 3 9 4 6 7 4 7 1 5 4 6 6 2 7 8
1 + 3 + 9 + 4 + 6 + 7 + 4 + 7 + 1 + 5 + 4 + 6 + 6 + 2 + 7 + 8
80
80 % 10 == 0
gültig
1
6
2
3
4
5
7
JVM Functional Language Battle© Orientation in Objects GmbH 12
Der Kampf
beginnt
Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/
7
JVM Functional Language Battle© Orientation in Objects GmbH 13
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Variante 1
14
Variablen
Zustands-
änderungen
Schleifen
Tiefe der
Verschachtelung
Verzweigungen
Reihenfolge der
Anweisungen
8
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Variante 2
15
JVM Functional Language Battle© Orientation in Objects GmbH 16
OOP?
SRP?
DRY?
SoC?
Wie vs. Was?
Lesbarkeit?
Testbarkeit?
Wartbarkeit?
Erweiterbarkeit?
Wiederverwendbarkeit?
Parallelisierbarkeit?Foto von Christopher Kuszajewski, CC0 Public Domain Lizenz, https://pixabay.com/en/source-code-code-programming-c-583537/
9
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch mit sprechenden Methodennamen
17
JVM Functional Language Battle© Orientation in Objects GmbH 18
Typische
Eigenschaften
• Folge von Statements
– mit Schleifen, Verzweigungen,
Sprüngen
• Verändern von Zuständen
(Variablen)
• Vermischung von Was und
Wie (bei Schleifen)
• Vorsicht bei Nebenläufigkeit
Foto von tomwieden, CC0 Public Domain Lizenz,
https://pixabay.com/de/boule-kugeln-spielen-frankreich-141004/
10
JVM Functional Language Battle© Orientation in Objects GmbH 19
Funktional
https://twitter.com/mariofusco/status/571999216039542784
JVM Functional Language Battle© Orientation in Objects GmbH
Java klassisch – Spaghetti-Code
20
Aufspalten in Ziffern
Jede 2. Ziffer verdoppeln
Aufsummieren
Validierungsprüfung
Reihenfolge drehen
11
JVM Functional Language Battle© Orientation in Objects GmbH 21
Funktional
Imperativ
https://twitter.com/mariofusco/status/571999216039542784
JVM Functional Language Battle© Orientation in Objects GmbH 22
Wie sieht es in anderen
Sprachen aus?
Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/
12
JVM Functional Language Battle© Orientation in Objects GmbH
Groovy
• objektorientiert
• dynamisch und/statisch typisiert
• ausdrucksstarke/prägnante Syntax
• sehr gute Integration mit Java (JVM, Bibliotheken, Vererbung, …)
• Metaprogrammierung, Closures, Operatorüberladung
• Funktionsliterale (Closures) sind First Class Citizens
23
JVM Functional Language Battle© Orientation in Objects GmbH
Beispiele in Groovy
24
13
JVM Functional Language Battle© Orientation in Objects GmbH 25
Viele Beispiele in vielen
anderen Sprache später …
Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/
JVM Functional Language Battle© Orientation in Objects GmbH
Frege
• Haskell for the JVM
• rein funktionale Programmiersprache
• statisch typisiert mit Typinferenz und Typvariablen
• frei von Nebeneffekten
• Monaden zur Kapselung von imperativen Konstrukten
• Pattern Matching
• Typklassen
26
14
JVM Functional Language Battle© Orientation in Objects GmbH
Funktionskaskade
27
ntoD
igit
s
reve
rsedo
ub
le2
nd
su
mD
igit
s
div
isib
le1
0
true
false
isValid n =divisibleBy10(sumDigits(double2nd(reverse(toDigits(n)))))
JVM Functional Language Battle© Orientation in Objects GmbH
Algorithmus in Frege
28
isValid n =
divisibleBy10(
sumDigits(
double2nd(
reverse(
toDigits(n))
))
)
Validierungsfunktion
Teilbar durch 10?
Aufsummieren
jede 2. verdoppeln
Ziffern umdrehen
Aufsplitten in Ziffern
15
JVM Functional Language Battle© Orientation in Objects GmbH
• Immutability
• pure/seiteneffektfrei
• referentielle Transparenz
• Funktionen als First-Class-
Citizens
• Higher-Order Functions
• Lambdas/Closures
• Lazy Evaluation
• Rekursion
• Pattern Matching
• Currying/Partial Function
Application
• Function Composition
• …
29
Foto von Mohamed Nuzrath, CC0 Public Domain Lizenz,
https://pixabay.com/de/kick-martial-arts-krieger-185384/
Typische
Eigenschaften
JVM Functional Language Battle© Orientation in Objects GmbH
Validierungsfunktion
toDigits n | n < 0 = error "n must be 0 or greater"
toDigits 0 = []
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
double2nd = zipWith (\x y -> x * y) (cycle [1, 2])
double2nd' = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
sumDigits' = sum . concat . map toDigits
divisibleBy10 n = mod n 10 == 0
isValid = divisibleBy10 . sumDigits . double2nd .
reverse . toDigits
30
16
JVM Functional Language Battle© Orientation in Objects GmbH
Umwandlung in Ziffern
toDigits n | n < 0 = error "n must be 0 or greater"
toDigits 0 = []
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
double2nd = zipWith (\x y -> x * y) (cycle [1, 2])
double2nd' = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
sumDigits' = sum . concat . map toDigits
divisibleBy10 n = mod n 10 == 0
isValid = divisibleBy10 . sumDigits . double2nd .
reverse . toDigits
31
Pattern Matching Rekursion
JVM Functional Language Battle© Orientation in Objects GmbH
Jeweils 2. Ziffer verdoppeln
toDigits n | n < 0 = error "n must be 0 or greater"
toDigits 0 = []
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
double2nd = zipWith (\x y -> x * y) (cycle [1, 2])
double2nd' = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
sumDigits' = sum . concat . map toDigits
divisibleBy10 n = mod n 10 == 0
isValid = divisibleBy10 . sumDigits . double2nd .
reverse . toDigits
32
Higher Order Function
Lazy EvaluationLambda-Ausdruck
Persistente
DatenstrukturenPartial Function
Application
17
JVM Functional Language Battle© Orientation in Objects GmbH
Aufsummieren der Ziffern
toDigits n | n < 0 = error "n must be 0 or greater"
toDigits 0 = []
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
double2nd = zipWith (\x y -> x * y) (cycle [1, 2])
double2nd' = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
sumDigits' = sum . concat . map toDigits
divisibleBy10 n = mod n 10 == 0
isValid = divisibleBy10 . sumDigits . double2nd .
reverse . toDigits
33
Function Composition:
f . g (x) == f(g(x))
Partial Function
Application
JVM Functional Language Battle© Orientation in Objects GmbH
Teilbar durch 10?
toDigits n | n < 0 = error "n must be 0 or greater"
toDigits 0 = []
toDigits n = toDigits (n `div` 10) ++ [(n `mod` 10)]
double2nd = zipWith (\x y -> x * y) (cycle [1, 2])
double2nd' = zipWith (*) (cycle [1, 2])
sumDigits xs = sum (concat (map toDigits xs))
sumDigits' = sum . concat . map toDigits
divisibleBy10 n = n `mod` 10 == 0
isValid = divisibleBy10 . sumDigits . double2nd .
reverse . toDigits
34
Infix- statt Postfix-Notation
18
JVM Functional Language Battle© Orientation in Objects GmbH
• leicht verständlich
• seiteneffektfrei
• einfach test-/debugbar
• leicht parallelisierbar
• modularisierbar und einfach
wieder zusammenführbar
• hohe Code-Qualität
36
Foto von Mohamed Nuzrath, CC0 Public Domain Lizenz,
https://pixabay.com/de/kick-martial-arts-krieger-185384/
Vorteile
JVM Functional Language Battle© Orientation in Objects GmbH
OO vs. Funktional
37
https://twitter.com/mfeathers/status/29581296216
https://twitter.com/mariofusco/status/63573247425384448
19
JVM Functional Language Battle© Orientation in Objects GmbH 38
Ist Java 8
funktional?
Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/
JVM Functional Language Battle© Orientation in Objects GmbH
Luhn-Algorithmus in Java 8 – Variante 1
39
20
JVM Functional Language Battle© Orientation in Objects GmbH
Was ist "Funktional Programmieren" mit Java 8?
• Lambdas: Funktionsliterale als First-Class-Citizens
• Higher-Order Functions (map, forEach)
• Currying und Funktionskomposition
• Bedarfsauswertung durch Streams (bedingt)
• (Rekursion)
40
JVM Functional Language Battle© Orientation in Objects GmbH
Java 8: Currying und partielle Funktionsaufrufe
41
Currying: Konvertierung einer Funktion mit n Argumenten
in n Funktionen mit jeweils einem Argument.
21
JVM Functional Language Battle© Orientation in Objects GmbH
Java 8: Funktionskomposition
42
Wiederverwendung von kleinen Funktionen: (f . g)(x) == f(g(x))
JVM Functional Language Battle© Orientation in Objects GmbH
Was fehlt Java 8 zur besseren funktionalen
Unterstützung?
• Erzwingen von Immutability
• persistente/unveränderbare Datenstrukturen
• Vermeidung von Seiteneffekten (erzwingen)
• beliebige Bedarfsauswertungen (mehr als unendliche Streams)
• funktionale Bibliotheksfunktionen
43
22
JVM Functional Language Battle© Orientation in Objects GmbH
Luhn-Algorithmus in Java 8 – Variante 2
44
JVM Functional Language Battle© Orientation in Objects GmbH
Funktionale Erweiterungen für Java
45
Project Lombok
23
JVM Functional Language Battle© Orientation in Objects GmbH
FunctionalJava
• funktionale Programmierbibliothek für Java
• Lernplattform für funktionale Programmierung mit der gewohnten
Sprache
• unterstützt Java 6+ (mit Retro Lambda)
• Basis Datenstrukturen (Funktionen, partielle Funktionen, Unit, Void,
Option, Either, …
• Immutable Collections (Array, List, Stream, Set, Map, …)
• Monaden, Zipper
48
JVM Functional Language Battle© Orientation in Objects GmbH
Luhn-Algorithmus in Java 8 mit Functional Java
49
24
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang
• "Javaslang is a functional library for Java 8+ that provides persistent
data types and functional control structures."
• Persistent Data Structures
– LinkedList, Queue, Sorted Set, Stream
• Tuple
• Functions, CheckedFunctions
50
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Currying
52
25
JVM Functional Language Battle© Orientation in Objects GmbH
Javaslang: Partielle Funktionsaufrufe und
Komposition
53
JVM Functional Language Battle© Orientation in Objects GmbH
Luhn-Algorithmus in Java 8 mit Javaslang
55
26
JVM Functional Language Battle© Orientation in Objects GmbH 56
Fazit
Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/
JVM Functional Language Battle© Orientation in Objects GmbH 57
Foto von Hans Braxmeier, CC0 Public Domain Lizenz, https://pixabay.com/de/teller-suppenteller-essteller-1365805/
27
JVM Functional Language Battle© Orientation in Objects GmbH 58
+
JVM Functional Language Battle© Orientation in Objects GmbH
Links
• Code-Beispiele
– https://github.com/sippsack/jvm-functional-language-battle
• Learn You a Haskell for Great Good!
– http://learnyouahaskell.com/chapters
• LYAH (Learn You a Haskell) adaptions for Frege
– https://github.com/Frege/frege/wiki/LYAH-adaptions-for-Frege
• Project Lombok, Functional Java, Javaslang
– https://projectlombok.org/
– http://www.functionaljava.org/
– http://www.javaslang.io/
59
28
JVM Functional Language Battle© Orientation in Objects GmbH
Literaturhinweise
60
• Functional Programming in Java: Harnessing the Power Of Java 8 Lambda Expressions
– Venkat Subramaniam
– The Pragmatic Programmers, Erscheinungsdatum: Februar 2014
– ISBN: 978-1-93778-546-8
– Sprache: Englisch
• Mastering Lambdas– Maurice Naftalin
– Oracle Press
– Erscheinungsdatum: Oktober 2014
– ISBN: 0071829628
– Sprache: Englisch
JVM Functional Language Battle© Orientation in Objects GmbH
Literaturhinweise
61
• Learn You a Haskell for Great Good!: A Beginner's Guide– Miran Lipovaca
– No Starch Press, Erscheinungsdatum: April 2011
– ISBN: 978-1593272838
– Sprache: Englisch
• Real World Haskell
– Bryan O'Sullivan und John Goerzen
– O'Reilly, Erscheinungsdatum: 2010
– ISBN: 978-0596514983
– Sprache: Englisch
29
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
??
? ?
????
Fragen ?
62
Orientation in Objects GmbH
Weinheimer Str. 68
68309 Mannheim
www.oio.de
Vielen Dank für Ihre
Aufmerksamkeit !