65
Hjelp, vi skal kode funksjonelt i Java! 1 JavaZone 2016 Fredrik Vraalsen fredriv [email protected]

Hjelp, vi skal kode funksjonelt i Java!

Embed Size (px)

Citation preview

Page 1: Hjelp, vi skal kode funksjonelt i Java!

Hjelp, vi skal kode funksjonelt i Java!

1

JavaZone 2016

Fredrik Vraalsen

fredriv [email protected]

Page 2: Hjelp, vi skal kode funksjonelt i Java!
Page 3: Hjelp, vi skal kode funksjonelt i Java!
Page 4: Hjelp, vi skal kode funksjonelt i Java!

KompleksitetIboende

Utilsiktet / tilfeldig

4http://i533.photobucket.com/albums/ee339/Sushigirl-94/Funny%20Signs/crazy-sign-0508141.jpg

Page 5: Hjelp, vi skal kode funksjonelt i Java!

Funksjonell programmering?

© Fredrik Vraalsen 2012

Page 6: Hjelp, vi skal kode funksjonelt i Java!

Java 8Anonyme funksjoner (lambda)

Stream

6

Page 7: Hjelp, vi skal kode funksjonelt i Java!

Java 8Anonyme funksjoner (lambda)

Stream

Optional ?

7

Page 8: Hjelp, vi skal kode funksjonelt i Java!

Hva mangler?Immutability

Value-objekter

Datastrukturer (lister, maps, etc.)

Parallellitet

8

Page 9: Hjelp, vi skal kode funksjonelt i Java!

Unngå endringVerdier kan ikke endres – beregne nye

Dele data fritt

Lettere å resonnere

Ytelsesforbedringer

9

Page 10: Hjelp, vi skal kode funksjonelt i Java!

Value-objekter

10https://blog.perbrage.com/2012/04/07/is-it-an-entity-or-a-value-object/

Page 11: Hjelp, vi skal kode funksjonelt i Java!

Value-objekterimmutables.io

Lombok

Ren Java

11

Page 12: Hjelp, vi skal kode funksjonelt i Java!

immutables.iopublic interface Person { String name(); int age();}

12

Page 13: Hjelp, vi skal kode funksjonelt i Java!

[email protected] interface Person { String name(); int age();}

13

Page 14: Hjelp, vi skal kode funksjonelt i Java!

[email protected] interface Person { String name(); int age();}

Person person = ImmutablePerson.builder() .name("Fredrik") .age(40) .build();

14

Page 15: Hjelp, vi skal kode funksjonelt i Java!

[email protected] interface Person { String name(); int age();}

Person person = ...

Person older = ImmutablePerson.copyOf(person) .withAge(41);

15

Page 16: Hjelp, vi skal kode funksjonelt i Java!

Lombokpublic class Person { String name; int age;}

16

Page 17: Hjelp, vi skal kode funksjonelt i Java!

Lombok@Valuepublic class Person { String name; int age;}

17

Page 18: Hjelp, vi skal kode funksjonelt i Java!

Lombok@Valuepublic class Person { String name; int age;}

Person person = new Person("Fredrik", 40);

18

Page 19: Hjelp, vi skal kode funksjonelt i Java!

Lombok@Valuepublic class Person { String name; @Wither int age;}

Person person = new Person("Fredrik", 40);

Person older = person.withAge(41);

19

Page 20: Hjelp, vi skal kode funksjonelt i Java!

UtfordringerAnnotation processing

IDE plugins

20

Page 21: Hjelp, vi skal kode funksjonelt i Java!

Ren Javapublic class Person { public final String name; public final int age; public Person(String name, int age) { this.name = name; this.age = age; }

// equals, hashCode, withAge, ...}

21

Page 22: Hjelp, vi skal kode funksjonelt i Java!

Collections

22

© Fredrik Vraalsen 2012

Page 23: Hjelp, vi skal kode funksjonelt i Java!

Funksjonelle datastrukturerUnmodifiable

Immutable

Persistent

23

Page 24: Hjelp, vi skal kode funksjonelt i Java!

Immutable

24

123original

Page 25: Hjelp, vi skal kode funksjonelt i Java!

Immutable

25

123

123

original

Page 26: Hjelp, vi skal kode funksjonelt i Java!

Immutable

26

123

1234new

original

Page 27: Hjelp, vi skal kode funksjonelt i Java!

Persistent

27

123original

Page 28: Hjelp, vi skal kode funksjonelt i Java!

Persistent

28

123

4new

original

Page 29: Hjelp, vi skal kode funksjonelt i Java!

Funksjonelle datastrukturerpCollections

Javaslang

FunctionalJava

29

Page 30: Hjelp, vi skal kode funksjonelt i Java!

pCollectionsPStack<String> names = ConsPStack.from( Arrays.asList("Luke Skywalker”, "Han Solo"));

30

Page 31: Hjelp, vi skal kode funksjonelt i Java!

pCollectionsPStack<String> names = ConsPStack.from( Arrays.asList("Luke Skywalker”, "Han Solo”)); PStack<String> moreNames = names.plus("Darth Vader");

31

Page 32: Hjelp, vi skal kode funksjonelt i Java!

pCollectionsPStack<String> names = ConsPStack.from( Arrays.asList("Luke Skywalker”, "Han Solo"));PStack<String> moreNames = names.plus("Darth Vader"); List<String> skywalkers = moreNames .stream() .filter(name -> name.contains("Skywalker")) .collect(Collectors.toList());

32

Page 33: Hjelp, vi skal kode funksjonelt i Java!

Functional JavaList<String> names = list("Luke Skywalker", "Han Solo");

33

Page 34: Hjelp, vi skal kode funksjonelt i Java!

Functional JavaList<String> names = list("Luke Skywalker", "Han Solo");List<String> moreNames = names.cons("Darth Vader");

34

Page 35: Hjelp, vi skal kode funksjonelt i Java!

Functional JavaList<String> names = list("Luke Skywalker", "Han Solo");List<String> moreNames = names.cons("Darth Vader");List<String> skywalkers = names .filter(name -> name.contains("Skywalker"));

35

Page 36: Hjelp, vi skal kode funksjonelt i Java!

JavaslangList<String> names = List.of("Luke Skywalker", "Han Solo");List<String> moreNames = names.prepend("Darth Vader");List<String> skywalkers = names .filter(name -> name.contains("Skywalker"));

36

Page 37: Hjelp, vi skal kode funksjonelt i Java!

Velge riktig datastruktur

37

Page 38: Hjelp, vi skal kode funksjonelt i Java!

Velge riktig datastruktur

38

Page 39: Hjelp, vi skal kode funksjonelt i Java!

Velge riktig datastruktur(Linked)List/Stack vs Vector vs Array

39

Page 40: Hjelp, vi skal kode funksjonelt i Java!

Performance

© Fredrik Vraalsen 2012

Page 41: Hjelp, vi skal kode funksjonelt i Java!

Streams – performanceList<Article> frontpageArticles = frontpage.getArticleIds().stream() .map(id -> fetchArticle(id)) .collect(toList());

41

Page 42: Hjelp, vi skal kode funksjonelt i Java!

This one goes to 11!List<Article> frontpageArticles = frontpage.getArticleIds().parallelStream() .map(id -> fetchArticle(id)) .collect(toList());

42

Page 43: Hjelp, vi skal kode funksjonelt i Java!

StarvationCommon F/J thread pool

Workarounds?

Execute within explicit F/J pool

Use CompletableFuture

43

Page 44: Hjelp, vi skal kode funksjonelt i Java!

CompletableFutureChaining of async futures and actions

Waiting for all or any future(s)

Explicitly complete (like Promise)

Control of executor service

44

http://blog.krecan.net/2014/03/18/how-to-specify-thread-pool-for-java-8-parallel-streams/http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

Page 45: Hjelp, vi skal kode funksjonelt i Java!

To parallelStream or not to …Batch?

parallelStream FTW!

Interactive? Concurrency?

CompletableFuture FTW!45

Page 46: Hjelp, vi skal kode funksjonelt i Java!

AlternativerJavaslang Future

FunctionalJava parMap etc.

cyclops-react

Actors

46

Page 47: Hjelp, vi skal kode funksjonelt i Java!

For comprehensionsimport static javaslang.API.For;

For( someAsyncTask(), otherAsyncTask() )

47

Page 48: Hjelp, vi skal kode funksjonelt i Java!

For comprehensionsimport static javaslang.API.For;

For( someAsyncTask(), otherAsyncTask() ).yield((foo, bar) -> foo + bar)

48

Page 49: Hjelp, vi skal kode funksjonelt i Java!

For comprehensionsimport static javaslang.API.For;

String result = For( someAsyncTask(), otherAsyncTask() ).yield((foo, bar) -> foo + bar).get();

49

Page 50: Hjelp, vi skal kode funksjonelt i Java!

ActorsMeldingsbasert

Lokalt = Sekvensiell kø

Flere actors = Parallellitet

50

Page 51: Hjelp, vi skal kode funksjonelt i Java!

ActorsAkka

FunctionalJava

51

Page 52: Hjelp, vi skal kode funksjonelt i Java!

Andre hjelpemidler

52Enklere Liv / http://painkillerblogg.blogspot.no/2010/10/hjelpemidler.html

Page 53: Hjelp, vi skal kode funksjonelt i Java!

JavaslangStreams = lazy linked lists

Tupler, funksjoner

Option, Either, Future

Feilhåndtering (Try)

Pattern matching53

Page 54: Hjelp, vi skal kode funksjonelt i Java!

Try Try.of(() -> doSomeWork())

54

Page 55: Hjelp, vi skal kode funksjonelt i Java!

Try Try.of(() -> doSomeWork()) .map(r -> transform(r))

55

Page 56: Hjelp, vi skal kode funksjonelt i Java!

Try Try.of(() -> doSomeWork()) .map(r -> transform(r)) .getOrElse(defaultValue);

56

Page 57: Hjelp, vi skal kode funksjonelt i Java!

TryA result = Try.of(() -> doSomeWork()) .map(r -> transform(r)) .getOrElse(defaultValue);

57

Page 58: Hjelp, vi skal kode funksjonelt i Java!

EitherKan returnere en av to verdier

Typisk suksess eller feilmelding

58

Page 59: Hjelp, vi skal kode funksjonelt i Java!

Either doComputation() // Either<String, R>

59

Page 60: Hjelp, vi skal kode funksjonelt i Java!

Either doComputation() .flatMap(r -> toXml(r)) // Either<String, Document>

60

Page 61: Hjelp, vi skal kode funksjonelt i Java!

EitherDocument result = doComputation() .flatMap(r -> toXml(r)) .getOrElseGet(errorMsg -> toErrorXml(errorMsg));

61

Page 62: Hjelp, vi skal kode funksjonelt i Java!

jOOλTupler, funksjoner

Seq

62

Page 63: Hjelp, vi skal kode funksjonelt i Java!

cyclops-reactAsynkron programmering

Utvidelser av JDK, pCollections, m.m.

Interoperabilitet (AnyM)

63

Page 64: Hjelp, vi skal kode funksjonelt i Java!

Functional programmingEnklere kode

Mer robust

Bedre ytelse

Page 65: Hjelp, vi skal kode funksjonelt i Java!

Spørsmål?

© Fredrik Vraalsen 2012

fredriv

[email protected]