Java 8 to the rescue!?

78
Java 8 to the rescue!? JavaZone 2013 1 torsdag 12. september 13

description

Java 8 will finally deliver us to the promised land of functional programming! So can we stop worrying now about learning Scala and Clojure and the other new kids on the block? We'll look at what new powers the new features such as Lambdas, Default Methods and Streams give us, as well as what Java is still lacking compared to other functional languages on the JVM.

Transcript of Java 8 to the rescue!?

Page 1: Java 8 to the rescue!?

Java 8 to the rescue!?JavaZone 2013

1

torsdag 12. september 13

Page 2: Java 8 to the rescue!?

2

RETURN OFTHE AVAJ

JAVA EIGHT

torsdag 12. september 13

Page 3: Java 8 to the rescue!?

Fredrik Vraalsen

[email protected]

Dad, Java developer,

Scala enthusiast, sci-fi fan, photo geek

and Age of Conan assassin

@fredriv

© Fredrik Vraalsen 2008

torsdag 12. september 13

Page 4: Java 8 to the rescue!?

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

Compact profiles

...

4

torsdag 12. september 13

Page 5: Java 8 to the rescue!?

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

Compact profiles

...

5

torsdag 12. september 13

Page 6: Java 8 to the rescue!?

Your MissionShould you choose to accept it

Sort a list of peopleby their names

torsdag 12. september 13

Page 7: Java 8 to the rescue!?

Java 7List<Person> people = ...

Collections.sort(people);

7

torsdag 12. september 13

Page 8: Java 8 to the rescue!?

Java 7Collections.sort(people, new Comparator<Person>() {

});

8

torsdag 12. september 13

Page 9: Java 8 to the rescue!?

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

}});

9

torsdag 12. september 13

Page 10: Java 8 to the rescue!?

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

10

torsdag 12. september 13

Page 11: Java 8 to the rescue!?

We are not amused

© Fredrik Vraalsen 2012

torsdag 12. september 13

Page 12: Java 8 to the rescue!?

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

12

torsdag 12. september 13

Page 13: Java 8 to the rescue!?

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

Collections.sort(people, byName);

13

torsdag 12. september 13

Page 14: Java 8 to the rescue!?

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

sort(people, byName);Collections.

14

torsdag 12. september 13

Page 15: Java 8 to the rescue!?

sort(people, byName)

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

( , ;

Lisp?

15

torsdag 12. september 13

Page 16: Java 8 to the rescue!?

What about Java 8?© Fredrik Vraalsen 2012

torsdag 12. september 13

Page 17: Java 8 to the rescue!?

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

sort(people, byName);

17

torsdag 12. september 13

Page 18: Java 8 to the rescue!?

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

people.sort(byName);

18

torsdag 12. september 13

Page 19: Java 8 to the rescue!?

Java 8

19

java.util.List:

default void sort(Comparator<? super E> c)

torsdag 12. september 13

Page 20: Java 8 to the rescue!?

Java 8

Defender MethodDefault Method

(Virtual) Extension Method20

java.util.List:

default void sort(Comparator<? super E> c)

torsdag 12. september 13

Page 21: Java 8 to the rescue!?

Java 8java.util.List:

default void sort(Comparator<? super E> c) { }

Defender MethodDefault Method

(Virtual) Extension Method21

torsdag 12. september 13

Page 22: Java 8 to the rescue!?

Java 8java.util.List:

default void sort(Comparator<? super E> c) { Collections.sort(this, c); }

Defender MethodDefault Method

(Virtual) Extension Method22

torsdag 12. september 13

Page 23: Java 8 to the rescue!?

Extension methodExtend interfaces with new methods

Compatibility

Default implementation

Override

23

torsdag 12. september 13

Page 24: Java 8 to the rescue!?

C# extension methodsStatic methods

Cannot be overridden

One-size fits all solution

24

torsdag 12. september 13

Page 25: Java 8 to the rescue!?

Scala Traits“Interfaces on steroids”

Method implementations

Variables

Everything a class can have – except constructors

Can mix in multiple traits25

torsdag 12. september 13

Page 26: Java 8 to the rescue!?

Ok, nice...What else?

© Fredrik Vraalsen 2012

torsdag 12. september 13

Page 27: Java 8 to the rescue!?

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

Single Abstract Method

(SAM)27

torsdag 12. september 13

Page 28: Java 8 to the rescue!?

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

28

torsdag 12. september 13

Page 29: Java 8 to the rescue!?

Lambda

Closure

Anonymous function29

torsdag 12. september 13

Page 30: Java 8 to the rescue!?

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

30

torsdag 12. september 13

Page 31: Java 8 to the rescue!?

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

31

torsdag 12. september 13

Page 32: Java 8 to the rescue!?

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

32

torsdag 12. september 13

Page 33: Java 8 to the rescue!?

LambdaComparator<Person> byName =

return x.getName().compareTo(y.getName()); };

BodyReturn type?

Parameter list

(Person x, Person y) -> {

33

torsdag 12. september 13

Page 34: Java 8 to the rescue!?

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

Parameter list

BodyReturn type?

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

};return

34

torsdag 12. september 13

Page 35: Java 8 to the rescue!?

LambdaComparator<Person> byName =

Parameter list

BodyReturn type?

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

35

torsdag 12. september 13

Page 36: Java 8 to the rescue!?

Lambda – putting it togetherComparator<Person> byName = (x, y) -> x.getName().compareTo(y.getName());

people.sort(byName);

36

torsdag 12. september 13

Page 37: Java 8 to the rescue!?

Lambda – putting it together

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

37

torsdag 12. september 13

Page 38: Java 8 to the rescue!?

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

38

torsdag 12. september 13

Page 39: Java 8 to the rescue!?

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

vs

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

39

torsdag 12. september 13

Page 40: Java 8 to the rescue!?

Cool!

Now onwards...© Fredrik Vraalsen 2013

torsdag 12. september 13

Page 41: Java 8 to the rescue!?

Method handlesReference to methods

Can be used in place of lambdas

41

torsdag 12. september 13

Page 42: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

42

torsdag 12. september 13

Page 43: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

Comparator<Person> byName = (Person a, Person b) -> a.compareByName(b);

43

torsdag 12. september 13

Page 44: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

Comparator<Person> byName = (a, b) -> a.compareByName(b);

44

torsdag 12. september 13

Page 45: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

Comparator<Person> byName = Person::compareByName;

45

torsdag 12. september 13

Page 46: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

Comparator<Person> byName = Person::compareByName;people.sort(byName);

46

torsdag 12. september 13

Page 47: Java 8 to the rescue!?

Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}

people.sort(Person::compareByName);

47

torsdag 12. september 13

Page 48: Java 8 to the rescue!?

So far, so good?Extension methods

Lambdas

Method handles

48

torsdag 12. september 13

Page 49: Java 8 to the rescue!?

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

torsdag 12. september 13

Page 50: Java 8 to the rescue!?

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

Others may be using it?

Concurrency issues

Performance

50

torsdag 12. september 13

Page 51: Java 8 to the rescue!?

Streams

© Fredrik Vraalsen 2008

torsdag 12. september 13

Page 52: Java 8 to the rescue!?

The old fashioned wayList<String> namesOfAdults = new ArrayList<>();

for (Person p : people) { if (p.getAge() >= 18) { namesOfAdults.add(p.getName()); }}

52

torsdag 12. september 13

Page 53: Java 8 to the rescue!?

StreamsStream<Person> stream = people.stream();

Stream<Person> adults = stream.filter(p -> p.getAge() >= 18);

Stream<String> namesOfAdults = adults.map(Person::getName);

53

torsdag 12. september 13

Page 54: Java 8 to the rescue!?

Streams – compose

Stream<String> namesOfAdults = people.stream(). filter(p -> p.getAge() >= 18). map(Person::getName);

54

torsdag 12. september 13

Page 55: Java 8 to the rescue!?

Streams – collect

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

55

torsdag 12. september 13

Page 56: Java 8 to the rescue!?

Streams – collect

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

56

torsdag 12. september 13

Page 57: Java 8 to the rescue!?

Performance

© Fredrik Vraalsen 2012

torsdag 12. september 13

Page 58: Java 8 to the rescue!?

Streams – performance

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

58

torsdag 12. september 13

Page 59: Java 8 to the rescue!?

Streams – performance

List<String> namesOfAdults = people.parallelStream(). filter(p -> p.getAge() >= 18). map(Person::getName). collect(toList());

59

torsdag 12. september 13

Page 60: Java 8 to the rescue!?

Scala FTW!

val namesOfAdults = people. filter(p => p.age >= 18). map(p => p.name)

60

torsdag 12. september 13

Page 61: Java 8 to the rescue!?

Scala FTW!

val namesOfAdults = people. filter(_.age >= 18). map(_.name)

61

torsdag 12. september 13

Page 62: Java 8 to the rescue!?

Scala FTW!

val namesOfAdults = people.filter(_.age >= 18).map(_.name)

62

torsdag 12. september 13

Page 63: Java 8 to the rescue!?

Scala FTW!

val namesOfAdults = people.par.filter(_.age >= 18).map(_.name).toList

63

torsdag 12. september 13

Page 64: Java 8 to the rescue!?

Streams – sorting

List<Person> sorted = people.stream(). sort(Person::compareByName). collect(Collectors.toList());

64

torsdag 12. september 13

Page 65: Java 8 to the rescue!?

Scala FTW 2!

val sorted = people.sortBy(_.name)

65

torsdag 12. september 13

Page 66: Java 8 to the rescue!?

Streams – pipelinesSource

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

Intermediate operations (Stream-producing)

filter, map, ...

Terminal operations (value-producing)

66

torsdag 12. september 13

Page 67: Java 8 to the rescue!?

Streamsjava.util.stream

Create new results

Lazy

Parallelizable

67

torsdag 12. september 13

Page 68: Java 8 to the rescue!?

Ready tomake the jump!?

© Fredrik Vraalsen 2013

torsdag 12. september 13

Page 69: Java 8 to the rescue!?

Play with it!Download from http://jdk8.java.net/download.html

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

FAQ http://www.lambdafaq.org/

Supported in IntelliJ IDEA 12 (and NetBeans nightlies?)

69

torsdag 12. september 13

Page 70: Java 8 to the rescue!?

Why use X instead?Java 8 not yet released (duh!)

March 2014?

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

Clojure and Scala available NOW! (JDK 1.5 and 1.6)

Important things are still missing

70

torsdag 12. september 13

Page 71: Java 8 to the rescue!?

What’s missing?© Fredrik Vraalsen 2012

torsdag 12. september 13

Page 72: Java 8 to the rescue!?

What’s missing?Immutability

Value types

Immutable data structures

Lists, maps, sets, etc.

72

torsdag 12. september 13

Page 73: Java 8 to the rescue!?

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

And transformations (functions) computing new values

Concurrency

Parallelism

Robustness

Testability

Better / higher abstractions

Less code, less bugs!73

torsdag 12. september 13

Page 74: Java 8 to the rescue!?

Some help to be foundImmutable collections

Google Guava, FunctionalJava

Concurrency mechanisms

Akka (Actors, STM)

74

torsdag 12. september 13

Page 75: Java 8 to the rescue!?

What else is missing?Type inference

Pattern matching

For comprehensions

Named and default parameters

Properties

Implicit parameters / conversions

and much more...http://stackoverflow.com/questions/3844745/scala-advantages-after-java-having-closures/3844844#3844844 75

torsdag 12. september 13

Page 76: Java 8 to the rescue!?

LambdaJ

Easier manipulation of collections and more, limited closure support

Google Guava

Lots of nice utility classes, some functional programming support

FunctionalJava

Most “pure” FP – but slow, separate collection hierarchy

Funcito

Simplify creation of functions from existing methods

Integrates with Guava, FunctionalJava, Jedi, ...

But I’m stuck in Java 6... Help!

76

torsdag 12. september 13

Page 77: Java 8 to the rescue!?

Questions?

© Fredrik Vraalsen 2012

[email protected] / @fredriv

torsdag 12. september 13

Page 78: Java 8 to the rescue!?

torsdag 12. september 13