jvm functional language battle · dazu in alternativen jvm-sprachen (groovy, frege, ggf. scala bzw....

39
1 Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de [email protected] Version: 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 Feedback gern an: @sippsack, [email protected] Co-Organisator

Upload: others

Post on 26-Jul-2020

26 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

1

Orientation in Objects GmbH

Weinheimer Str. 68

68309 Mannheim

www.oio.de

[email protected]:

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

Feedback gern an: @sippsack, [email protected]

Co-Organisator

Page 2: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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.

Page 3: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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

ScalaJavaScript

Frege

FunktionalImperativ

Page 4: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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/

FunktionalImperativ

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/

Page 5: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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

Page 6: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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/

Page 7: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

7

JVM Functional Language Battle© Orientation in Objects GmbH 13

JVM Functional Language Battle© Orientation in Objects GmbH

Java klassisch – Variante 1

14

Page 8: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

8

JVM Functional Language Battle© Orientation in Objects GmbH

Java klassisch – Variante 2

15

Variablen

Zustands-

änderungen

Schleifen

Tiefe der

Verschachtelung

Verzweigungen

Reihenfolge

nicht beliebig

Exception-

Handling?

JVM Functional Language Battle© Orientation in Objects GmbH 16

OOP?

SRP?

DRY?

SoC?

Lesbarkeit?

Testbarkeit?

Wartbarkeit?

Erweiterbarkeit?

Wiederverwendbarkeit?

Parallelisierbarkeit?

Foto von Christopher Kuszajewski, CC0 Public Domain Lizenz, https://pixabay.com/en/source-code-code-programming-c-583537/

Page 9: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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)

• Exceptions = Goto-Statements

• Vorsicht bei Nebenläufigkeit

Foto von tomwieden, CC0 Public Domain Lizenz,

https://pixabay.com/de/boule-kugeln-spielen-frankreich-141004/

Page 10: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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

Page 11: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

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/

Page 12: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

12

JVM Functional Language Battle© Orientation in Objects GmbH

Groovy

• objektorientiert

• dynamisch typisiert (statisch auch möglich)

• 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

Page 13: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

13

JVM Functional Language Battle© Orientation in Objects GmbH

JavaScript

• objektorientierte Skriptsprache

• aber klassenlos (Prototyp-basiert)

• dynamisch typisiert

• Funktionen sind First Class Citizens

• geeignet für Client (Browser) und Server (Node.js, Nashorn)

25

JVM Functional Language Battle© Orientation in Objects GmbH

Beispiel JavaScript

26

Page 14: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

14

JVM Functional Language Battle© Orientation in Objects GmbH

Kotlin

• statisch typisiert

• objektorientiert

• Übersetzung in Java Bytecode oder JavaScript Quellcode

• interoperabel mit Java

• entwickelt bei Jetbrains (IntelliJ IDEA)

27

JVM Functional Language Battle© Orientation in Objects GmbH

Beispiel Kotlin

28

Page 15: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

15

JVM Functional Language Battle© Orientation in Objects GmbH 29

http://codegolf.eu-west-1.elasticbeanstalk.com/results

Kurz, kürzer, lesbarer?

JVM Functional Language Battle© Orientation in Objects GmbH 30

Viele Beispiele in vielen

imperativen Sprachen

später …

Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/

Page 16: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

16

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

31

JVM Functional Language Battle© Orientation in Objects GmbH 32

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

Aufsplitten in Ziffern

Ziffern umdrehen

jede 2. verdoppeln

Ziffern aufspalten

Teilsummen

Aufsummieren

Teilbar durch 10?

Page 17: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

17

JVM Functional Language Battle© Orientation in Objects GmbH

Algorithmus in Frege

33

isValid n =

divisibleBy10(

sumDigits(

double2nd(

reverse(

toDigits(n))

))

)

Validierungsfunktion

Teilbar durch 10?

Aufsummieren

jede 2. verdoppeln

Ziffern umdrehen

Aufsplitten in Ziffern

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionskaskade

34

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)))))

Page 18: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

18

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

• …

35

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

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

36

Page 19: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

19

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

37

Infix- statt Postfix-Notation

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

38

Function Composition:

f . g (x) == f(g(x))

Page 20: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

20

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

39

Higher Order Function

Lazy EvaluationLambda-Ausdruck

Persistente

Datenstrukturen

Partial Function

Application

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

40

Pattern Matching Rekursion

Page 21: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

21

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Elemente

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])

sumDigits xs = sum (concat (map toDigits xs))

divisibleBy10 n = n `mod` 10 == 0

isValid = divisibleBy10 . sumDigits . double2nd .

reverse . toDigits

41

JVM Functional Language Battle© Orientation in Objects GmbH

• leicht verständlich, einfach zu

schlussfolgern

• seiteneffektfrei

• einfach test-/debugbar

• leicht parallelisierbar

• modularisierbar und einfach

wieder zusammenführbar

• hohe Code-Qualität

42

Foto von Mohamed Nuzrath, CC0 Public Domain Lizenz,

https://pixabay.com/de/kick-martial-arts-krieger-185384/

Vorteile

Page 22: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

22

JVM Functional Language Battle© Orientation in Objects GmbH

OO vs. Funktional

43

https://twitter.com/mfeathers/status/29581296216

https://twitter.com/mariofusco/status/63573247425384448

JVM Functional Language Battle© Orientation in Objects GmbH

Scala

• funktional und objektorientiert

• statisch typisiert (Typinferenz)

• Funktionen als First-Class-Citizens

• Pattern Matching

• Java-Integration möglich

44

Page 23: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

23

JVM Functional Language Battle© Orientation in Objects GmbH

Beispiel Scala

45

JVM Functional Language Battle© Orientation in Objects GmbH 46

Ist Java 8

funktional?

Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/

Page 24: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

24

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 – Variante 1

47

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 – Variante 2

48

nach Idee von Thomas Much

Page 25: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

25

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8

Variante 1 (vs. Variante 1.1) vs. Variante 2

// 1 if length even, 2 otherwise

int[] i = { number.length() % 2 == 0 ? 1 : 2 };

.map(n -> n * (i[0] = i[0] == 1 ? 2 : 1))

// oder Ref<Boolean> alternate = new Ref(false);

// .map(n -> n * (alternate.swap() ? 2 : 1))

PrimitiveIterator.OfInt faktor = IntStream.iterate(1, i -> 3 - i).iterator();

System.out.println(faktor.nextInt()); // 1

System.out.println(faktor.nextInt()); // 2

System.out.println(faktor.nextInt()); // 1

System.out.println(faktor.nextInt()); // 2

49

Verkappte Zustandsänderung

Lazy Evaluation

Generator

JVM Functional Language Battle© Orientation in Objects GmbH

Was heißt "Funktional Programmieren" in Java 8?

• Lambdas: Funktionsliterale als First-Class-Citizens

• Higher-Order Functions (map, forEach)

• Currying und Funktionskomposition

• Unendliche Datenstrukturen mit Streams

• (Rekursion)

50

Page 26: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

26

JVM Functional Language Battle© Orientation in Objects GmbH

Java 8: Wiederverwendung von Funktionen

Funktionskomposition

51

Verketten/Komposition von Teil-Funktionen: (f . g)(x) == f(g(x))

JVM Functional Language Battle© Orientation in Objects GmbH

Java 8: Wiederverwendung von Funktionen

Currying und partielle Funktionsaufrufe

52

Currying: Konvertierung einer Funktion mit n Argumenten

in n Funktionen mit jeweils einem Argument.

Partielle Aufrufe: Spezialisierung von allgemeinen Funktionen

Page 27: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

27

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)

• Lazy Evualation

• kein echtes Currying

• funktionale Bibliotheksfunktionen

• Value-Types (Tuple, Either, Try, Validation, Lazy …)

53

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 – Variante 3

Frege/Haskell Style

54

Page 28: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

28

JVM Functional Language Battle© Orientation in Objects GmbH

Funktionale Erweiterungen für Java

55

Project Lombok

JVM Functional Language Battle© Orientation in Objects GmbH

Project Lombok

• Compile-Time Metaprogrammierung

• Reducing Boilerplate Code durch Annotationen

• Generation des Immutable-Gerüsts mit @Value

• Lazy Evaluierung mit @Getter(lazy = true)

56

Page 29: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

29

JVM Functional Language Battle© Orientation in Objects GmbH 57

private, final,

keine Setter,

Argument-Konstruktor

equals/hashcode

Lazy-Evaluierung

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

58

Page 30: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

30

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 mit Functional Java

59

JVM Functional Language Battle© Orientation in Objects GmbH

Vavr

• "Vavr core is a functional library for Java 8+."

• Persistent Data Structures

– LinkedList, Queue, Sorted Set, Stream

• Tuple, Values (Option, Try, Lazy, Either, …)

• Pattern Matching

• Functions, CheckedFunctions, Lifting (Exceptions fangen)

– Currying, Partial Application, Composition

• Monaden, Zipping, …

60

Page 31: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

31

JVM Functional Language Battle© Orientation in Objects GmbH 61

http://www.vavr.io/vavr-docs/

JVM Functional Language Battle© Orientation in Objects GmbH

Vavr: Tuple (bis Tuple8)

62

Page 32: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

32

JVM Functional Language Battle© Orientation in Objects GmbH

Vavr: Wiederverwendung von Funktionen

Currying

63

JVM Functional Language Battle© Orientation in Objects GmbH

Vavr: Wiederverwendung von Funktionen

Partielle Funktionsaufrufe und Komposition

64

Page 33: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

33

JVM Functional Language Battle© Orientation in Objects GmbH

Vavr: Function Lift (Fangen von Exceptions)

65

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 mit Vavr

66

Page 34: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

34

JVM Functional Language Battle© Orientation in Objects GmbH

Luhn-Algorithmus in Java 8 mit Vavr (Variante 2)

67

JVM Functional Language Battle© Orientation in Objects GmbH 68

Fazit

Foto von Marco Montoya, CC0 Public Domain Lizenz, https://pixabay.com/de/ajedrez-k%C3%B6nig-schach-spiel-640386/

Page 35: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

35

JVM Functional Language Battle© Orientation in Objects GmbH 69

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 70

Foto von Hans Braxmeier, CC0 Public Domain Lizenz, https://pixabay.com/de/teller-suppenteller-essteller-1365805/

Page 36: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

36

JVM Functional Language Battle© Orientation in Objects GmbH 71

+

Project Lombok

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

• Onlinekurs TU Delft (FP 101):

– https://courses.edx.org/courses/DelftX/FP101x/3T2014/info

72

Page 37: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

37

JVM Functional Language Battle© Orientation in Objects GmbH

Links

• Vavr

– http://www.vavr.io/

• Immutables

– http://immutables.github.io/

• Project Lombok

– https://projectlombok.org/

• Functional Java

– http://www.functionaljava.org/

73

JVM Functional Language Battle© Orientation in Objects GmbH

Literaturhinweise

74

• 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

Page 38: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

38

JVM Functional Language Battle© Orientation in Objects GmbH

Literaturhinweise

75

• 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

Orientation in Objects GmbH

Weinheimer Str. 68

68309 Mannheim

www.oio.de

[email protected]

??

? ?

????

Fragen ?

76

Page 39: JVM Functional Language Battle · dazu in alternativen JVM-Sprachen (Groovy, Frege, ggf. Scala bzw. JavaScript) anschauen und die verschiedenen Lösungen diskutieren. ... Frege •

39

Orientation in Objects GmbH

Weinheimer Str. 68

68309 Mannheim

www.oio.de

[email protected]

Vielen Dank für Ihre

Aufmerksamkeit !