Top Banner
Functional Programming in Java 8 flatMap 2014 Fredrik Vraalsen – @fredriv 1
70

Functional programming in Java 8 - workshop at flatMap Oslo 2014

May 10, 2015

Download

Software

Slides from a workshop on Functional programming in Java 8, held at the flatMap Oslo conference 2014.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Functional Programming in Java 8!

flatMap 2014 !!

Fredrik Vraalsen – @fredriv

1

Page 2: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 8 – what’s new?Lambdas, Extension Methods, SAMs, Streams, Method Handles, Oh My!

Nashorn JS engine

JSR-310: Date & time API

No more PermGen – where classloaders go to die

...2

Page 3: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 8 – what’s new?Lambdas, Extension Methods, SAMs, Streams, Method Handles, Oh My!

Nashorn JS engine

JSR-310: Date & time API

No more PermGen – where classloaders go to die

...3

Page 4: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Your Mission Should you choose to accept it

Sort a list of people by their names

Page 5: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 7Collections.sort(people, new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); } });

5

Page 6: Functional programming in Java 8 - workshop at flatMap Oslo 2014

We are not amused

© Fredrik Vraalsen 2012

Page 7: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 8Comparator<Person> byName = new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); } };

Single Abstract Method !

(SAM)7

Page 8: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Single Abstract MethodInterface with only one (non-default) method

Abstract class with only one abstract method

Sound familiar?

Pretty much every event listener, callback mechanism, ...

Can be replaced by a Lambda

8

Page 9: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda

Closure

Anonymous function9

Page 10: Functional programming in Java 8 - workshop at flatMap Oslo 2014

SAMComparator<Person> byName = new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); } };

BodyReturn type

Parameter list

Method name

Type

10

Page 11: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName = new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); } };

BodyReturn type

Parameter list

Method name

Type

11

Page 12: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName = ! return x.getName().compareTo(y.getName()); };

BodyReturn type?

Parameter list

(Person x, Person y) -> {

12

Page 13: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName = (Person x, Person y) ->

Parameter list

BodyReturn type?

x.getName().compareTo(y.getName());{

};return

13

Page 14: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName =

Parameter list

BodyReturn type?

(x, y) -> x.getName().compareTo(y.getName()); (Person x, Person y)

14

Page 15: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName = (x, y) -> x.getName().compareTo(y.getName()); !Collections.sort(people, byName);

15

Page 16: Functional programming in Java 8 - workshop at flatMap Oslo 2014

LambdaComparator<Person> byName = (x, y) -> x.getName().compareTo(y.getName()); !sort(people, byName);

16

Page 17: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda!!!sort(people, (x, y) -> x.getName().compareTo(y.getName()));

17

Page 18: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda!!!sort(people, (x, y) -> x.getName().compareTo(y.getName())); !!!

int compare(Person x, Person y)

18

Page 19: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda!!!sort(people, (x, y) -> x.getName().compareTo(y.getName())); !!!

(Person, Person) -> int

19

Page 20: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda!!!sort(dogs, (x, y) -> x.getName().compareTo(y.getName())); !!!

(Dog, Dog) -> int

20

Page 21: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Lambda!!!sort(people, (x, y) -> x.getName().compareTo(y.getName()));

21

Page 22: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Comparatorsimport static java.util.Comparator.comparing; … !sort(people, comparing((Person p) -> p.getName());

22

Page 23: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Cool! !

!

!

!

Now onwards...© Fredrik Vraalsen 2013

Page 24: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Method handlesReference to methods

Can be used in place of lambdas

24

Page 25: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Method handles!!!sort(people, comparing((Person p) -> p.getName()));

25

Page 26: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Method handles!!!sort(people, comparing((Person p) -> p.getName())); !!

(Person) -> String

26

Page 27: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Method handles!!!sort(people, comparing(Person::getName)); !!

(Person) -> String

27

Page 28: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Ok, nice... What else?

© Fredrik Vraalsen 2012

Page 29: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Extension methods!!!sort(people, comparing(Person::getName));

29

Page 30: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Extension methods!!!people.sort(comparing(Person::getName));

30

Page 31: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Extension methods

Defender Method Default Method

(Virtual) Extension Method31

java.util.List: ! default void sort(Comparator<? super E> c)

Page 32: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Extension methodsjava.util.List: ! default void sort(Comparator<? super E> c) { } !

Defender Method Default Method

(Virtual) Extension Method32

Page 33: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Extension methodsjava.util.List: ! default void sort(Comparator<? super E> c) { Collections.sort(this, c); } !

Defender Method Default Method

(Virtual) Extension Method33

Page 34: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 8 extension methodsExtend interfaces with new methods

Compatibility

Default implementation

Override

Requires modification of original interface34

Page 35: Functional programming in Java 8 - workshop at flatMap Oslo 2014

C# extension methods“Add” methods to existing types

Without modifying original type

Defined as static methods

Called as instance methods

35

Page 36: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Scala Traits“Interfaces on steroids”

Method implementations

Variables

Everything a class can have – except constructors

Can mix in multiple traits36

Page 37: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Scala implicit classes“Add” methods or properties to existing types

Without modifying original type

Implicit wrapper object

37

Page 38: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Java 7 vs 8Collections.sort(people, new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); } });

!vs

!people.sort(comparing(Person::getName));

38

Page 39: Functional programming in Java 8 - workshop at flatMap Oslo 2014

So far, so good?Lambdas

Method handles

Extension methods

39

Page 40: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Exercise!git clone https://github.com/fredriv/fp-java8

open Exercise_1_Lambda_Expressions_Test.java in your favourite editor

mvn test

40

Page 41: Functional programming in Java 8 - workshop at flatMap Oslo 2014

So, what’s the catch?© Fredrik Vraalsen 2012

Page 42: Functional programming in Java 8 - workshop at flatMap Oslo 2014

What’s wrong with using List::sort ?Modifies existing collection

Others may be using it?

Concurrency issues

Performance

42

Page 43: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streams

© Fredrik Vraalsen 2008

Page 44: Functional programming in Java 8 - workshop at flatMap Oslo 2014

The old fashioned way

44

List<RoadData> filtered = new ArrayList<>();int count = 0; for (Iterator<RoadData> i = roadData.iterator(); i.hasNext() && count < 10; ) { RoadData data = i.next(); if (data.getName().contains(nameQuery)) { filtered.add(data); count++; } }

Page 45: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streams

45

!roadData.stream() .filter(r -> r.getName().contains(nameQuery)) .limit(10) .collect(Collectors.toList());

Page 46: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streams – pipelines

46

!roadData.stream() .filter(r -> r.getName().contains(nameQuery)) .limit(10) .collect(Collectors.toList());!!cat roadData.txt | grep … | head > output.txt

Page 47: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streams – pipelinesSource

collection, array, generator function, IO channel, ...

Intermediate operations (Stream-producing)

filter, map, ...

Terminal operations (value-producing)

47

Page 48: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Examples

48

Java 7: !Map<String, List<Article>> relatedArticles = new HashMap<>();!for (ArticleTransport transport : articleTransports) { Article article = convertToArticle(transport); String category = getCategory(article);! List<Article> articles = relatedArticles.get(category); if (articles == null) { articles = new ArrayList<>(); relatedArticles.put(category, articles); } articles.add(article);}

Page 49: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Examples

49

Java 8: !Map<String, List<Article>> relatedArticles = articleTransports.stream() .map(transport -> convertToArticle(transport)) .collect(Collectors.groupingBy(article -> getCategory(article)));

Page 50: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Examples

50

Java 7: !for (Map.Entry<K, List<Article>> e : relatedArticles.entrySet()) { result.put(e.getKey(), convertToTeasers(e.getValue()));}

Page 51: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Examples

51

Java 7: !for (Map.Entry<K, List<Article>> e : relatedArticles.entrySet()) { result.put(e.getKey(), convertToTeasers(e.getValue()));}!!Java 8: !relatedArticles.forEach((k, v) -> result.put(k, convertToTeasers(v)));

Page 52: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Performance

© Fredrik Vraalsen 2012

Page 53: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streams – performance!List<String> namesOfAdults = people.stream() .filter(p -> p.getAge() >= 18) .map(Person::getName) .collect(Collectors.toList());

53

Page 54: Functional programming in Java 8 - workshop at flatMap Oslo 2014

This one goes to 11!!List<String> namesOfAdults = people.parallelStream() .filter(p -> p.getAge() >= 18) .map(Person::getName) .collect(Collectors.toList());

54

Page 55: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Streamsjava.util.stream

Create new results

Lazy

Parallelizable

55

Page 56: Functional programming in Java 8 - workshop at flatMap Oslo 2014

More cool stuff in Java 8String join

Collection removeIf (≈ filter)

Map getOrDefault, putIfAbsent, replace, forEach, etc.

java.util.Optional

java.util.stream.Collectors

count, sum, average, min, max, groupingBy, etc.

java.nio.file.Files lines56

Page 57: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Exercise!Exercise_2_Streams_Test.java

57

Page 58: Functional programming in Java 8 - workshop at flatMap Oslo 2014

What’s missing?© Fredrik Vraalsen 2012

Page 59: Functional programming in Java 8 - workshop at flatMap Oslo 2014

What’s missing?Immutability

Value types

Data structures (lists, maps, etc.)

Concurrency

59

Page 60: Functional programming in Java 8 - workshop at flatMap Oslo 2014

What’s the big deal?Functional programming is all about values!

And transformations (functions) computing new values

Parallellism vs. Concurrency

Robustness

Testability

60

Page 61: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Some help to be foundImmutable collections

Google Guava, FunctionalJava, clj-ds

Concurrency mechanisms

Akka (Actors, STM)

61

Page 62: Functional programming in Java 8 - workshop at flatMap Oslo 2014

github.com/krukow/clj-dsPersistentVector<Person> people = Persistents.vector( new Person("Fredrik", 37), new Person("Hedda", 2));

62

Page 63: Functional programming in Java 8 - workshop at flatMap Oslo 2014

github.com/krukow/clj-dsPersistentVector<Person> people = Persistents.vector( new Person("Fredrik", 37), new Person("Hedda", 2));!PersistentVector<Person> morePeople = people.plus(new Person("Johannes", 4));

63

Page 64: Functional programming in Java 8 - workshop at flatMap Oslo 2014

github.com/krukow/clj-dsPersistentVector<Person> people = Persistents.vector( new Person("Fredrik", 37), new Person("Hedda", 2));!PersistentVector<Person> morePeople = people.plus(new Person("Johannes", 4));!morePeople.stream() .forEach(p -> System.out.println(p.getName()));

64

Page 65: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Ready to make the jump!?

© Fredrik Vraalsen 2013

Page 66: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Play with it!Download – http://www.oracle.com/technetwork/java/

… or https://jdk8.java.net/download.html

Whitepapers – http://openjdk.java.net/projects/lambda/

FAQ – http://www.lambdafaq.org/

Supported in IntelliJ IDEA 12 & 13

Eclipse Java 8 beta plugin and NetBeans 8.0 RC 66

Page 67: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Why use X instead?Java 8 just released

Will be a long time before you can use it in enterprise dev!

Clojure and Scala available NOW!

Important things are still missing

67

Page 68: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Want to know more?^{Oslo "Socially Functional Programmers" #OsloSFP}

http://www.meetup.com/Oslo-Socially-Functional/

68

Page 69: Functional programming in Java 8 - workshop at flatMap Oslo 2014

Questions?

© Fredrik Vraalsen 2012

[email protected] / @fredriv

Page 70: Functional programming in Java 8 - workshop at flatMap Oslo 2014