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
[email protected] interface Person { String name(); int age();}
13
[email protected] interface Person { String name(); int age();}
Person person = ImmutablePerson.builder() .name("Fredrik") .age(40) .build();
14
[email protected] 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