102
Copyright © 2013 Russel Winder 1 Java 8 A New Beginning Russel Winder email: [email protected] xmpp: [email protected] twitter: @russel_winder Web: http://www.russel.org.uk

Java 8: a New Beginning

Embed Size (px)

DESCRIPTION

Slides from my ACCU 2013 session introducing some of the Java 8 features.

Citation preview

Page 1: Java 8: a New Beginning

Copyright © 2013 Russel Winder 1

Java 8A New Beginning

Russel Winder

email: [email protected]: [email protected]

twitter: @russel_winderWeb: http://www.russel.org.uk

Page 2: Java 8: a New Beginning

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.

Page 3: Java 8: a New Beginning

Copyright © 2013 Russel Winder 3

Structure

A Beginning

A Middle

An End

Page 4: Java 8: a New Beginning

Copyright © 2013 Russel Winder 4

Interstitial Advertisement

?

Page 5: Java 8: a New Beginning

Copyright © 2013 Russel Winder 5

A Beginning

Page 6: Java 8: a New Beginning

Copyright © 2013 Russel Winder 6

Many people are still using Java 1.4.

Page 7: Java 8: a New Beginning

Copyright © 2013 Russel Winder 7

They see no reason to move to anylater version of Java:

no real benefit, for too much pain.

Page 8: Java 8: a New Beginning

Copyright © 2013 Russel Winder 8

Java 5 is a barrier too far for them.

Page 9: Java 8: a New Beginning

Copyright © 2013 Russel Winder 9

The Java 7 Java 8 change→is an even more disruptive change.

Page 10: Java 8: a New Beginning

Copyright © 2013 Russel Winder 10

This possibly means Javais now a legacy language?

Page 11: Java 8: a New Beginning

Copyright © 2013 Russel Winder 11

No, it's an opportunity to stopprogramming using 1970s techniques

and start using 1930s ones.

Page 12: Java 8: a New Beginning

Copyright © 2013 Russel Winder 12

Alonzo ChurchStephen Kleene

J B RosserAlan Turing

Page 13: Java 8: a New Beginning

Copyright © 2013 Russel Winder 13

Another Beginning

Page 14: Java 8: a New 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.

Page 15: Java 8: a New Beginning

Copyright © 2013 Russel Winder 15

What's (Quite) Interesting in Java 8?

● G1 garbage collector.● Nashorn.● JavaFX.

● Lambda expressions.● Enhanced collections.

Page 16: Java 8: a New Beginning

Copyright © 2013 Russel Winder 16

G1 garbage collector is now the standard:

No more PermGen.

Page 17: Java 8: a New Beginning

Copyright © 2013 Russel Winder 17

Nashorn comes as standard:

Server-side JavaScript without Rhino.

Page 18: Java 8: a New Beginning

Copyright © 2013 Russel Winder 18

JavaFX in the distribution and the classpath:

You probably want to use GroovyFX though.

Page 19: Java 8: a New Beginning

Copyright © 2013 Russel Winder 19

Lambda expressions, and associatedcollections enhancements.

Page 20: Java 8: a New Beginning

Copyright © 2013 Russel Winder 20

Closures

Page 21: Java 8: a New Beginning

Copyright © 2013 Russel Winder 21

A closure is a function with an associated environment containing values for all the free

variables in the function.

Page 22: Java 8: a New Beginning

Copyright © 2013 Russel Winder 22

Integer f(final Integer x) { return x * y ;}

Free variable.

A Function

Page 23: Java 8: a New Beginning

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

Page 24: Java 8: a New Beginning

Copyright © 2013 Russel Winder 24

Java has had things (sort of) like thissince (almost) the beginning…

Page 25: Java 8: a New Beginning

Copyright © 2013 Russel Winder 25

A closure can be realized as an instance ofa class with a single method and

single assignment fields.

Page 26: Java 8: a New Beginning

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.

Page 27: Java 8: a New Beginning

Copyright © 2013 Russel Winder 27

final ClosureClass multiplyBy5 = new ClosureClass(5);

multiplyBy5.call(4)

Page 28: Java 8: a New Beginning

Copyright © 2013 Russel Winder 28

Alternatively, using anonymous classes…

Page 29: Java 8: a New Beginning

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)

Page 30: Java 8: a New Beginning

Copyright © 2013 Russel Winder 30

Java has accreted a reputation for being verbose.

Page 31: Java 8: a New Beginning

Copyright © 2013 Russel Winder 31

Unlike Groovy, Scala, Kotlin, Ceylon, etc.

Page 32: Java 8: a New Beginning

Copyright © 2013 Russel Winder 32

Or Python, D, C++ (!), etc.

Page 33: Java 8: a New Beginning

Copyright © 2013 Russel Winder 33

final multiplyBy5 = {5 * it}

multiplyBy5(4)

multiplyBy5.call(4)

final multiplyBy5 = {i -> 5 * i}

Page 34: Java 8: a New Beginning

Copyright © 2013 Russel Winder 34

def multiplyBy5(i: Int): Int = 5 * i

multiplyBy5(4)

Page 35: Java 8: a New Beginning

Copyright © 2013 Russel Winder 35

How to do all this stuff in Java whilstkeeping backward compatibility?

Page 36: Java 8: a New Beginning

Copyright © 2013 Russel Winder 36

Page 37: Java 8: a New Beginning

Copyright © 2013 Russel Winder 37

Do not use anonymous classes.

Page 38: Java 8: a New Beginning

Copyright © 2013 Russel Winder 38

Page 39: Java 8: a New Beginning

Copyright © 2013 Russel Winder 39

We have method handles…

Page 40: Java 8: a New Beginning

Copyright © 2013 Russel Winder 40

…and invokedynamic.

Page 41: Java 8: a New Beginning

Copyright © 2013 Russel Winder 41

final ClosureInterface<Integer> multiplyBy5 = i -> 5 * i;

multiplyBy5.call(4)

public interface ClosureInterface<T> { T call(T t);}

Page 42: Java 8: a New Beginning

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.

Page 43: Java 8: a New Beginning

Copyright © 2013 Russel Winder 43

Nothing much revolutionary here,just a bit of syntactic sugar…

Page 44: Java 8: a New Beginning

Copyright © 2013 Russel Winder 44

…true (sort of), but that isn't all there is…

Page 45: Java 8: a New Beginning

Copyright © 2013 Russel Winder 45

A Middle

Page 46: Java 8: a New Beginning

Copyright © 2013 Russel Winder 46

It all about where the iteration is.

Page 47: Java 8: a New Beginning

Copyright © 2013 Russel Winder 47

Explicit iteration

vs.

Implicit iteration

Page 48: Java 8: a New Beginning

Copyright © 2013 Russel Winder 48

Work with a (trivial) example:

Page 49: Java 8: a New Beginning

Copyright © 2013 Russel Winder 49

Calculate the sum of the squares of the numbers between 0 and 100 that are

divisible by 7.

Page 50: Java 8: a New Beginning

Copyright © 2013 Russel Winder 50

int sum = 0;for (int i = 0; i < 100; ++i) { if (i % 7 == 0) { sum += i * i; }}

Page 51: Java 8: a New Beginning

Copyright © 2013 Russel Winder 51

(for (i <- 0 until 100; if i % 7 == 0) yield i * i).sum

Page 52: Java 8: a New Beginning

Copyright © 2013 Russel Winder 52

sum({for (i in 0..100) if (i % 7 == 0) i * i})

Page 53: Java 8: a New Beginning

Copyright © 2013 Russel Winder 53

sum(i * i for i in range(100) if i % 7 == 0)

Page 54: Java 8: a New Beginning

Copyright © 2013 Russel Winder 54

(0 until 100).filter(i => i %7 == 0).map(i => i * i).sum

Page 55: Java 8: a New Beginning

Copyright © 2013 Russel Winder 55

0.rangeTo(100).iterator().filter{i -> i % 7 == 0}.map{i -> i * i}.reduce{a, b -> a + b}

Page 56: Java 8: a New Beginning

Copyright © 2013 Russel Winder 56

sum((0..100).filter((Integer i) => i % 7 == 0).map((Integer i) => i * i))

Page 57: Java 8: a New Beginning

Copyright © 2013 Russel Winder 57

(0..100).findAll{i -> i % 7 == 0}.collect{i -> i * i}.sum()

Page 58: Java 8: a New Beginning

Copyright © 2013 Russel Winder 58

(0..100).findAll{it % 7 == 0}.collect{it * it}.sum()

Page 59: Java 8: a New Beginning

Copyright © 2013 Russel Winder 59

Streams.intRange(0, 100).filter(i -> i % 7 == 0).map(i -> i * i).sum()

Page 60: Java 8: a New Beginning

Copyright © 2013 Russel Winder 60

Higher Order Functions

Page 61: Java 8: a New Beginning

Copyright © 2013 Russel Winder 61

Functions that take functions as parameters and/or return functions as result.

Page 62: Java 8: a New Beginning

Copyright © 2013 Russel Winder 62

Some may be thinking:

Why do I give a f###?

Page 63: Java 8: a New Beginning

Copyright © 2013 Russel Winder 63

After all nothing good has happenedin Java since Java 1.4.2.

Page 64: Java 8: a New Beginning

Copyright © 2013 Russel Winder 64

Page 65: Java 8: a New Beginning

Copyright © 2013 Russel Winder 65

Because all computers arenow parallel computers.

Page 66: Java 8: a New Beginning

Copyright © 2013 Russel Winder 66

Page 67: Java 8: a New Beginning

Copyright © 2013 Russel Winder 67

We have to move to an attitude where we assume our software is not uniprocessor.

Page 68: Java 8: a New Beginning

Copyright © 2013 Russel Winder 68

We have to actually do object-orientedand functional programming.

Page 69: Java 8: a New Beginning

Copyright © 2013 Russel Winder 69

Instead of just saying we write code usingJava, C++, etc. and so must be

doing object-oriented programming.

Page 70: Java 8: a New Beginning

Copyright © 2013 Russel Winder 70

Streams.intRange(0, 100).filter(i -> i % 7 == 0).map(i -> i * i).sum()

From earlier…

Page 71: Java 8: a New Beginning

Copyright © 2013 Russel Winder 71

Streams.intRange(0, 100).parallel().filter(i -> i % 7 == 0).map(i -> i * i).sum()

Page 72: Java 8: a New Beginning

Copyright © 2013 Russel Winder 72

Data parallelism with a single method call.

Page 73: Java 8: a New Beginning

Copyright © 2013 Russel Winder 73

GParsPool.withPool { (0..100).findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()}

Page 74: Java 8: a New Beginning

Copyright © 2013 Russel Winder 74

GParsPool.withPool { (0..100).parallel.filter{it % 7 == 0}.map{it * it}.sum()}

Page 75: Java 8: a New Beginning

Copyright © 2013 Russel Winder 75

def value = (0..100)ParallelEnhancer.enhanceInstance(value)value = value.parallel.filter{it % 7 == 0}.map{it * it}.sum()

Page 76: Java 8: a New Beginning

Copyright © 2013 Russel Winder 76

def value = (0..100)ParallelEnhancer.enhanceInstance(value)value = value.findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()

Page 77: Java 8: a New Beginning

Copyright © 2013 Russel Winder 77

GPars and Groovy give you Java 8 styleapproach and parallelism today

for Java with JDK6 or JDK7.

Page 78: Java 8: a New Beginning

Copyright © 2013 Russel Winder 78

Guava, TotallyLazy, and FunctionalJava can be usedtoday to practice the functional approach using Java.

Page 79: Java 8: a New Beginning

Copyright © 2013 Russel Winder 79

Using Scala is an option fordoing functional programming*.

*And just ignore Java altogether.

Page 80: Java 8: a New Beginning

Copyright © 2013 Russel Winder 80

(0 until 100).par.filter(i => i %7 == 0).map(i => i * i).sum

Page 81: Java 8: a New Beginning

Copyright © 2013 Russel Winder 81

Or just install the JDK8 Lambda release.

Page 82: Java 8: a New Beginning

Copyright © 2013 Russel Winder 82

Page 83: Java 8: a New Beginning

Copyright © 2013 Russel Winder 83

Page 84: Java 8: a New Beginning

Copyright © 2013 Russel Winder 84

What is the Value of ?

Easy, it's known exactly.

It's .

Obviously.

Page 85: Java 8: a New Beginning

Copyright © 2013 Russel Winder 85

It's simples Александр Орлов 2009

Page 86: Java 8: a New Beginning

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

Page 87: Java 8: a New Beginning

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.

Page 88: Java 8: a New Beginning

Copyright © 2013 Russel Winder 88

Because addition is commutative andassociative, expression can be

decomposed into sums of partial sums.

Page 89: Java 8: a New Beginning

Copyright © 2013 Russel Winder 89

a + b + c + d + e + f

=

( a + b ) + ( c + d ) + ( e + f )

Page 90: Java 8: a New Beginning

Copyright © 2013 Russel Winder 90

Scatter – Gather

map reduce

Page 91: Java 8: a New Beginning

Copyright © 2013 Russel Winder 91

Code!

Page 92: Java 8: a New Beginning

Copyright © 2013 Russel Winder 92

An End

Page 93: Java 8: a New Beginning

Copyright © 2013 Russel Winder 93

Java is about to get the functional programming approach.

Page 94: Java 8: a New Beginning

Copyright © 2013 Russel Winder 94

Scala, Groovy, Kotlin, Ceylon,Python, D, C++, etc.

already have object-orientedand functional*.

* Well Scala has.

Page 95: Java 8: a New Beginning

Copyright © 2013 Russel Winder 95

It's all about how your data evolves.

It's not about the flow of control.

Page 96: Java 8: a New Beginning

Copyright © 2013 Russel Winder 96

Closures the next “big thing” in Java?

Page 97: Java 8: a New Beginning

Copyright © 2013 Russel Winder 97

Yes*.

*But will everyone ignore it?

Page 98: Java 8: a New Beginning

Copyright © 2013 Russel Winder 98

No.

Page 99: Java 8: a New Beginning

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.

Page 100: Java 8: a New Beginning

Copyright © 2013 Russel Winder 100

Interstitial Advertisement

?

Page 101: Java 8: a New Beginning

Copyright © 2013 Russel Winder 101

The End

Page 102: Java 8: a New Beginning

Copyright © 2013 Russel Winder 102

Java 8A New Beginning

Russel Winder

email: [email protected]: [email protected]

twitter: @russel_winderWeb: http://www.russel.org.uk/