Hjelp, vi skal kode funksjonelt i Java!

Preview:

Citation preview

Hjelp, vi skal kode funksjonelt i Java!

1

JavaZone 2016

Fredrik Vraalsen

fredriv fredrik.vraalsen@schibsted.com

KompleksitetIboende

Utilsiktet / tilfeldig

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

Funksjonell programmering?

© Fredrik Vraalsen 2012

Java 8Anonyme funksjoner (lambda)

Stream

6

Java 8Anonyme funksjoner (lambda)

Stream

Optional ?

7

Hva mangler?Immutability

Value-objekter

Datastrukturer (lister, maps, etc.)

Parallellitet

8

Unngå endringVerdier kan ikke endres – beregne nye

Dele data fritt

Lettere å resonnere

Ytelsesforbedringer

9

Value-objekter

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

Value-objekterimmutables.io

Lombok

Ren Java

11

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

12

immutables.io@Value.Immutablepublic interface Person { String name(); int age();}

13

immutables.io@Value.Immutablepublic interface Person { String name(); int age();}

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

14

immutables.io@Value.Immutablepublic interface Person { String name(); int age();}

Person person = ...

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

15

Lombokpublic class Person { String name; int age;}

16

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

17

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

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

18

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

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

Person older = person.withAge(41);

19

UtfordringerAnnotation processing

IDE plugins

20

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

Collections

22

© Fredrik Vraalsen 2012

Funksjonelle datastrukturerUnmodifiable

Immutable

Persistent

23

Immutable

24

123original

Immutable

25

123

123

original

Immutable

26

123

1234new

original

Persistent

27

123original

Persistent

28

123

4new

original

Funksjonelle datastrukturerpCollections

Javaslang

FunctionalJava

29

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

30

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

31

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

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

33

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

34

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

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

Velge riktig datastruktur

37

Velge riktig datastruktur

38

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

39

Performance

© Fredrik Vraalsen 2012

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

41

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

42

StarvationCommon F/J thread pool

Workarounds?

Execute within explicit F/J pool

Use CompletableFuture

43

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

To parallelStream or not to …Batch?

parallelStream FTW!

Interactive? Concurrency?

CompletableFuture FTW!45

AlternativerJavaslang Future

FunctionalJava parMap etc.

cyclops-react

Actors

46

For comprehensionsimport static javaslang.API.For;

For( someAsyncTask(), otherAsyncTask() )

47

For comprehensionsimport static javaslang.API.For;

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

48

For comprehensionsimport static javaslang.API.For;

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

49

ActorsMeldingsbasert

Lokalt = Sekvensiell kø

Flere actors = Parallellitet

50

ActorsAkka

FunctionalJava

51

Andre hjelpemidler

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

JavaslangStreams = lazy linked lists

Tupler, funksjoner

Option, Either, Future

Feilhåndtering (Try)

Pattern matching53

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

54

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

55

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

56

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

57

EitherKan returnere en av to verdier

Typisk suksess eller feilmelding

58

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

59

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

60

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

61

jOOλTupler, funksjoner

Seq

62

cyclops-reactAsynkron programmering

Utvidelser av JDK, pCollections, m.m.

Interoperabilitet (AnyM)

63

Functional programmingEnklere kode

Mer robust

Bedre ytelse

Spørsmål?

© Fredrik Vraalsen 2012

fredriv

fredrik.vraalsen@schibsted.com

Recommended