java 8 to the rescue!?
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
Java 8 to the rescue!?JavaZone 2013
1
torsdag 12. september 13
2
RETURN OFTHE AVAJ
JAVA EIGHT
torsdag 12. september 13
Fredrik Vraalsen
Dad, Java developer,
Scala enthusiast, sci-fi fan, photo geek
and Age of Conan assassin
@fredriv
© Fredrik Vraalsen 2008
torsdag 12. september 13
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
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
Your MissionShould you choose to accept it
Sort a list of peopleby their names
torsdag 12. september 13
Java 7List<Person> people = ...
Collections.sort(people);
7
torsdag 12. september 13
Java 7Collections.sort(people, new Comparator<Person>() {
});
8
torsdag 12. september 13
Java 7Collections.sort(people, new Comparator<Person>() { public int compare(Person x, Person y) {
}});
9
torsdag 12. september 13
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
We are not amused
© Fredrik Vraalsen 2012
torsdag 12. september 13
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
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
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
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
What about Java 8?© Fredrik Vraalsen 2012
torsdag 12. september 13
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
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
Java 8
19
java.util.List:
default void sort(Comparator<? super E> c)
torsdag 12. september 13
Java 8
Defender MethodDefault Method
(Virtual) Extension Method20
java.util.List:
default void sort(Comparator<? super E> c)
torsdag 12. september 13
Java 8java.util.List:
default void sort(Comparator<? super E> c) { }
Defender MethodDefault Method
(Virtual) Extension Method21
torsdag 12. september 13
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
Extension methodExtend interfaces with new methods
Compatibility
Default implementation
Override
23
torsdag 12. september 13
C# extension methodsStatic methods
Cannot be overridden
One-size fits all solution
24
torsdag 12. september 13
Scala Traits“Interfaces on steroids”
Method implementations
Variables
Everything a class can have – except constructors
Can mix in multiple traits25
torsdag 12. september 13
Ok, nice...What else?
© Fredrik Vraalsen 2012
torsdag 12. september 13
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
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
Lambda
Closure
Anonymous function29
torsdag 12. september 13
SAMComparator<Person> byName = new Comparator<Person>() { public int compare(Person x, Person y) { return x.getName().compareTo(y.getName()); }};
30
torsdag 12. september 13
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
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
LambdaComparator<Person> byName =
return x.getName().compareTo(y.getName()); };
BodyReturn type?
Parameter list
(Person x, Person y) -> {
33
torsdag 12. september 13
LambdaComparator<Person> byName = (Person x, Person y) ->
Parameter list
BodyReturn type?
x.getName().compareTo(y.getName());{
};return
34
torsdag 12. september 13
LambdaComparator<Person> byName =
Parameter list
BodyReturn type?
(x, y) -> x.getName().compareTo(y.getName());(Person x, Person y)
35
torsdag 12. september 13
Lambda – putting it togetherComparator<Person> byName = (x, y) -> x.getName().compareTo(y.getName());
people.sort(byName);
36
torsdag 12. september 13
Lambda – putting it together
people.sort((x, y) -> x.getName().compareTo(y.getName()));
37
torsdag 12. september 13
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
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
Cool!
Now onwards...© Fredrik Vraalsen 2013
torsdag 12. september 13
Method handlesReference to methods
Can be used in place of lambdas
41
torsdag 12. september 13
Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}
42
torsdag 12. september 13
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
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
Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}
Comparator<Person> byName = Person::compareByName;
45
torsdag 12. september 13
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
Method handlesclass Person { ... public int compareByName(Person other) { return name.compareTo(other.name); }}
people.sort(Person::compareByName);
47
torsdag 12. september 13
So far, so good?Extension methods
Lambdas
Method handles
48
torsdag 12. september 13
So, what’s the catch?© Fredrik Vraalsen 2012
torsdag 12. september 13
What’s wrong with using List::sort ?Modifies existing collection
Others may be using it?
Concurrency issues
Performance
50
torsdag 12. september 13
Streams
© Fredrik Vraalsen 2008
torsdag 12. september 13
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
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
Streams – compose
Stream<String> namesOfAdults = people.stream(). filter(p -> p.getAge() >= 18). map(Person::getName);
54
torsdag 12. september 13
Streams – collect
List<String> namesOfAdults = people.stream(). filter(p -> p.getAge() >= 18). map(Person::getName). collect(Collectors.toList());
55
torsdag 12. september 13
Streams – collect
List<String> namesOfAdults = people.stream(). filter(p -> p.getAge() >= 18). map(Person::getName). collect(toList());
56
torsdag 12. september 13
Performance
© Fredrik Vraalsen 2012
torsdag 12. september 13
Streams – performance
List<String> namesOfAdults = people.stream(). filter(p -> p.getAge() >= 18). map(Person::getName). collect(toList());
58
torsdag 12. september 13
Streams – performance
List<String> namesOfAdults = people.parallelStream(). filter(p -> p.getAge() >= 18). map(Person::getName). collect(toList());
59
torsdag 12. september 13
Scala FTW!
val namesOfAdults = people. filter(p => p.age >= 18). map(p => p.name)
60
torsdag 12. september 13
Scala FTW!
val namesOfAdults = people. filter(_.age >= 18). map(_.name)
61
torsdag 12. september 13
Scala FTW!
val namesOfAdults = people.filter(_.age >= 18).map(_.name)
62
torsdag 12. september 13
Scala FTW!
val namesOfAdults = people.par.filter(_.age >= 18).map(_.name).toList
63
torsdag 12. september 13
Streams – sorting
List<Person> sorted = people.stream(). sort(Person::compareByName). collect(Collectors.toList());
64
torsdag 12. september 13
Scala FTW 2!
val sorted = people.sortBy(_.name)
65
torsdag 12. september 13
Streams – pipelinesSource
collection, array, generator function, IO channel, ...
Intermediate operations (Stream-producing)
filter, map, ...
Terminal operations (value-producing)
66
torsdag 12. september 13
Streamsjava.util.stream
Create new results
Lazy
Parallelizable
67
torsdag 12. september 13
Ready tomake the jump!?
© Fredrik Vraalsen 2013
torsdag 12. september 13
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
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
What’s missing?© Fredrik Vraalsen 2012
torsdag 12. september 13
What’s missing?Immutability
Value types
Immutable data structures
Lists, maps, sets, etc.
72
torsdag 12. september 13
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
Some help to be foundImmutable collections
Google Guava, FunctionalJava
Concurrency mechanisms
Akka (Actors, STM)
74
torsdag 12. september 13
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
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
torsdag 12. september 13