Upload
russel-winder
View
3.797
Download
2
Embed Size (px)
DESCRIPTION
Slides from my ACCU 2013 session introducing some of the Java 8 features.
Citation preview
Copyright © 2013 Russel Winder 1
Java 8A New Beginning
Russel Winder
email: [email protected]: [email protected]
twitter: @russel_winderWeb: http://www.russel.org.uk
Copyright © 2013 Russel Winder 2
Aims, Goals and Objectives
● Investigate why Java 8 is the greatest revolution in Java since 1995.
● Investigate why some idioms from Java 0–7 lead to bad code in a post-Java 7 world.
● Show what some of the idioms of Java 8 and beyond are likely to be.
Copyright © 2013 Russel Winder 3
Structure
A Beginning
A Middle
An End
Copyright © 2013 Russel Winder 4
Interstitial Advertisement
?
Copyright © 2013 Russel Winder 5
A Beginning
Copyright © 2013 Russel Winder 6
Many people are still using Java 1.4.
Copyright © 2013 Russel Winder 7
They see no reason to move to anylater version of Java:
no real benefit, for too much pain.
Copyright © 2013 Russel Winder 8
Java 5 is a barrier too far for them.
Copyright © 2013 Russel Winder 9
The Java 7 Java 8 change→is an even more disruptive change.
Copyright © 2013 Russel Winder 10
This possibly means Javais now a legacy language?
Copyright © 2013 Russel Winder 11
No, it's an opportunity to stopprogramming using 1970s techniques
and start using 1930s ones.
Copyright © 2013 Russel Winder 12
Alonzo ChurchStephen Kleene
J B RosserAlan Turing
Copyright © 2013 Russel Winder 13
Another Beginning
Copyright © 2013 Russel Winder 14
What's New in Java 8
● Simon Ritter gave a talk about 55 things that are new in Java 8 at DevoxxUK 2013: http://www.devoxx.com/display/UK13/55+New+features+in+Java+SE+8
● The video will appear on Parleys once encoded.
Copyright © 2013 Russel Winder 15
What's (Quite) Interesting in Java 8?
● G1 garbage collector.● Nashorn.● JavaFX.
● Lambda expressions.● Enhanced collections.
Copyright © 2013 Russel Winder 16
G1 garbage collector is now the standard:
No more PermGen.
Copyright © 2013 Russel Winder 17
Nashorn comes as standard:
Server-side JavaScript without Rhino.
Copyright © 2013 Russel Winder 18
JavaFX in the distribution and the classpath:
You probably want to use GroovyFX though.
Copyright © 2013 Russel Winder 19
Lambda expressions, and associatedcollections enhancements.
Copyright © 2013 Russel Winder 20
Closures
Copyright © 2013 Russel Winder 21
A closure is a function with an associated environment containing values for all the free
variables in the function.
Copyright © 2013 Russel Winder 22
Integer f(final Integer x) { return x * y ;}
Free variable.
A Function
Copyright © 2013 Russel Winder 23
A closure should be referentially transparent.
Whenever function f is evaluated on the same value,a say, then the same value is returned.
f(a) = b
Copyright © 2013 Russel Winder 24
Java has had things (sort of) like thissince (almost) the beginning…
Copyright © 2013 Russel Winder 25
A closure can be realized as an instance ofa class with a single method and
single assignment fields.
Copyright © 2013 Russel Winder 26
public class ClosureClass { private final Integer multiplier; public ClosureClass(final Integer m) { multiplier = m; } public Integer call(final Integer i) { return multiplier * i; }}
No free variables in call.
Copyright © 2013 Russel Winder 27
final ClosureClass multiplyBy5 = new ClosureClass(5);
multiplyBy5.call(4)
Copyright © 2013 Russel Winder 28
Alternatively, using anonymous classes…
Copyright © 2013 Russel Winder 29
public interface ClosureInterface<T> { T call(T t);}
final ClosureInterface<Integer> multiplyBy5 = new ClosureInterface<Integer>() { public Integer call(final Integer i) { return 5 * i; } };
multiplyBy5.call(4)
Copyright © 2013 Russel Winder 30
Java has accreted a reputation for being verbose.
Copyright © 2013 Russel Winder 31
Unlike Groovy, Scala, Kotlin, Ceylon, etc.
Copyright © 2013 Russel Winder 32
Or Python, D, C++ (!), etc.
Copyright © 2013 Russel Winder 33
final multiplyBy5 = {5 * it}
multiplyBy5(4)
multiplyBy5.call(4)
final multiplyBy5 = {i -> 5 * i}
Copyright © 2013 Russel Winder 34
def multiplyBy5(i: Int): Int = 5 * i
multiplyBy5(4)
Copyright © 2013 Russel Winder 35
How to do all this stuff in Java whilstkeeping backward compatibility?
Copyright © 2013 Russel Winder 36
Copyright © 2013 Russel Winder 37
Do not use anonymous classes.
Copyright © 2013 Russel Winder 38
Copyright © 2013 Russel Winder 39
We have method handles…
Copyright © 2013 Russel Winder 40
…and invokedynamic.
Copyright © 2013 Russel Winder 41
final ClosureInterface<Integer> multiplyBy5 = i -> 5 * i;
multiplyBy5.call(4)
public interface ClosureInterface<T> { T call(T t);}
Copyright © 2013 Russel Winder 42
Lambda Expressions
● Functional interfaces – previously known as single abstract method (SAM) types.
● Call site type inference.● No classes: JVM byte code synthesis, method
handles and invokedynamic.
Copyright © 2013 Russel Winder 43
Nothing much revolutionary here,just a bit of syntactic sugar…
Copyright © 2013 Russel Winder 44
…true (sort of), but that isn't all there is…
Copyright © 2013 Russel Winder 45
A Middle
Copyright © 2013 Russel Winder 46
It all about where the iteration is.
Copyright © 2013 Russel Winder 47
Explicit iteration
vs.
Implicit iteration
Copyright © 2013 Russel Winder 48
Work with a (trivial) example:
Copyright © 2013 Russel Winder 49
Calculate the sum of the squares of the numbers between 0 and 100 that are
divisible by 7.
Copyright © 2013 Russel Winder 50
int sum = 0;for (int i = 0; i < 100; ++i) { if (i % 7 == 0) { sum += i * i; }}
Copyright © 2013 Russel Winder 51
(for (i <- 0 until 100; if i % 7 == 0) yield i * i).sum
Copyright © 2013 Russel Winder 52
sum({for (i in 0..100) if (i % 7 == 0) i * i})
Copyright © 2013 Russel Winder 53
sum(i * i for i in range(100) if i % 7 == 0)
Copyright © 2013 Russel Winder 54
(0 until 100).filter(i => i %7 == 0).map(i => i * i).sum
Copyright © 2013 Russel Winder 55
0.rangeTo(100).iterator().filter{i -> i % 7 == 0}.map{i -> i * i}.reduce{a, b -> a + b}
Copyright © 2013 Russel Winder 56
sum((0..100).filter((Integer i) => i % 7 == 0).map((Integer i) => i * i))
Copyright © 2013 Russel Winder 57
(0..100).findAll{i -> i % 7 == 0}.collect{i -> i * i}.sum()
Copyright © 2013 Russel Winder 58
(0..100).findAll{it % 7 == 0}.collect{it * it}.sum()
Copyright © 2013 Russel Winder 59
Streams.intRange(0, 100).filter(i -> i % 7 == 0).map(i -> i * i).sum()
Copyright © 2013 Russel Winder 60
Higher Order Functions
Copyright © 2013 Russel Winder 61
Functions that take functions as parameters and/or return functions as result.
Copyright © 2013 Russel Winder 62
Some may be thinking:
Why do I give a f###?
Copyright © 2013 Russel Winder 63
After all nothing good has happenedin Java since Java 1.4.2.
Copyright © 2013 Russel Winder 64
Copyright © 2013 Russel Winder 65
Because all computers arenow parallel computers.
Copyright © 2013 Russel Winder 66
Copyright © 2013 Russel Winder 67
We have to move to an attitude where we assume our software is not uniprocessor.
Copyright © 2013 Russel Winder 68
We have to actually do object-orientedand functional programming.
Copyright © 2013 Russel Winder 69
Instead of just saying we write code usingJava, C++, etc. and so must be
doing object-oriented programming.
Copyright © 2013 Russel Winder 70
Streams.intRange(0, 100).filter(i -> i % 7 == 0).map(i -> i * i).sum()
From earlier…
Copyright © 2013 Russel Winder 71
Streams.intRange(0, 100).parallel().filter(i -> i % 7 == 0).map(i -> i * i).sum()
Copyright © 2013 Russel Winder 72
Data parallelism with a single method call.
Copyright © 2013 Russel Winder 73
GParsPool.withPool { (0..100).findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()}
Copyright © 2013 Russel Winder 74
GParsPool.withPool { (0..100).parallel.filter{it % 7 == 0}.map{it * it}.sum()}
Copyright © 2013 Russel Winder 75
def value = (0..100)ParallelEnhancer.enhanceInstance(value)value = value.parallel.filter{it % 7 == 0}.map{it * it}.sum()
Copyright © 2013 Russel Winder 76
def value = (0..100)ParallelEnhancer.enhanceInstance(value)value = value.findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()
Copyright © 2013 Russel Winder 77
GPars and Groovy give you Java 8 styleapproach and parallelism today
for Java with JDK6 or JDK7.
Copyright © 2013 Russel Winder 78
Guava, TotallyLazy, and FunctionalJava can be usedtoday to practice the functional approach using Java.
Copyright © 2013 Russel Winder 79
Using Scala is an option fordoing functional programming*.
*And just ignore Java altogether.
Copyright © 2013 Russel Winder 80
(0 until 100).par.filter(i => i %7 == 0).map(i => i * i).sum
Copyright © 2013 Russel Winder 81
Or just install the JDK8 Lambda release.
Copyright © 2013 Russel Winder 82
Copyright © 2013 Russel Winder 83
Copyright © 2013 Russel Winder 84
What is the Value of ?
Easy, it's known exactly.
It's .
Obviously.
Copyright © 2013 Russel Winder 85
It's simples Александр Орлов 2009
Copyright © 2013 Russel Winder 86
Approximating
● What is it's value represented as a floating point number?● We can only obtain an approximation.● A plethora of possible algorithms to choose from, a
popular one is to employ the following integral equation.
4=∫0
1 1
1x2dx
Copyright © 2013 Russel Winder 87
One Possible Algorithm
● Use quadrature to estimate the value of the integral – which is the area under the curve.
=4n∑i=1
n 1
1i−0.5n
2
With n = 3 not much to do, but potentially lots of error. Use n = 107 or n = 109?
Embarrassingly parallel.
Copyright © 2013 Russel Winder 88
Because addition is commutative andassociative, expression can be
decomposed into sums of partial sums.
Copyright © 2013 Russel Winder 89
a + b + c + d + e + f
=
( a + b ) + ( c + d ) + ( e + f )
Copyright © 2013 Russel Winder 90
Scatter – Gather
map reduce
Copyright © 2013 Russel Winder 91
Code!
Copyright © 2013 Russel Winder 92
An End
Copyright © 2013 Russel Winder 93
Java is about to get the functional programming approach.
Copyright © 2013 Russel Winder 94
Scala, Groovy, Kotlin, Ceylon,Python, D, C++, etc.
already have object-orientedand functional*.
* Well Scala has.
Copyright © 2013 Russel Winder 95
It's all about how your data evolves.
It's not about the flow of control.
Copyright © 2013 Russel Winder 96
Closures the next “big thing” in Java?
Copyright © 2013 Russel Winder 97
Yes*.
*But will everyone ignore it?
Copyright © 2013 Russel Winder 98
No.
Copyright © 2013 Russel Winder 99
It is not the lambda expressions in Java 8 that is the disruptive revolution.
It's the change to the Java library that is.
It's all about those default methods*.
* Aka defender methods, virtual extension methods.
Copyright © 2013 Russel Winder 100
Interstitial Advertisement
?
Copyright © 2013 Russel Winder 101
The End
Copyright © 2013 Russel Winder 102
Java 8A New Beginning
Russel Winder
email: [email protected]: [email protected]
twitter: @russel_winderWeb: http://www.russel.org.uk/