closures: the next "big thing" in java

82
Copyright © 2012 Russel Winder 1 Closures The Next “Big Thing” in Java Russel Winder email: [email protected] xmpp: [email protected] twitter: @russel_winder

Post on 21-Oct-2014

1.239 views

Category:

Documents


3 download

DESCRIPTION

JAX London 2012 presentation about the coming features of Java 8, and the effect they have on programming idioms and use of parallelism.

TRANSCRIPT

Page 1: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 1

ClosuresThe Next “Big Thing” in Java

Russel Winder

email: [email protected]: [email protected]

twitter: @russel_winder

Page 2: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 2

ClosuresThe Next “Big Thing” in Java?

Russel Winder

email: [email protected]: [email protected]

twitter: @russel_winder

Page 3: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 3

Aims, Goals and Objectives

● 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.

● Survive to the end of the session.

Page 4: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 4

Structure

A beginning.

A middle.

An end.

Page 5: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 5

Interstitial Advertisement

Page 6: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 6

A Beginning

Page 7: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 7

Many people are still using Java 1.4.

Page 8: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 8

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

no real benefit, for too much pain.

Page 9: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 9

Java 5 is a barrier too far for them.

Page 10: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 10

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

Page 11: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 11

This possibly means Javais now a legacy language?

Page 12: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 12

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

and start using 1930s ones.

Page 13: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 13

Alonzo ChurchAlan Turing

Stephen KleeneJ B Rosser

Page 14: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 14

And an opportunity to do 1990s programming.

Page 15: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 15

i.e. We finally get to do real object-oriented programming using Java.

Page 16: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 16

Another Beginning

Page 17: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 17

What is a “closure”?

Page 18: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 18

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

variables in the function.

Page 19: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 19

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

Free variable.

A Function

Page 20: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 20

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 21: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 21

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

Page 22: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 22

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

single assignment fields.

Page 23: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 23

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 24: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 24

final ClosureClass multiplyBy5 = new ClosureClass(5);

multiplyBy5.call(4)

Page 25: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 25

Alternatively…

Page 26: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 26

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 27: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 27

If Java had operator overloading, thiscould be made to look much nicer.

Page 28: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 28

Just as it can in proper programming languages such as Groovy, Scala, C++, Python, etc.

Page 29: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 29

final multiplyBy5 = {5 * it}

multiplyBy5(4)

multiplyBy5.call(4)

final multiplyBy5 = {i -> 5 * i}

Page 30: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 30

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

multiplyBy5(4)

Page 31: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 31

But Java 8 can do stuff a bit like that…

Page 32: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 32

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

multiplyBy5.call(4)

Page 33: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 33

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

Page 34: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 34

…true, but that isn't all there is…

Page 35: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 35

A Middle

Page 36: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 36

It all about where the iteration is.

Page 37: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 37

Explicit iteration

vs.

Implicit iteration

Page 38: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 38

Work with a (trivial) example:

Page 39: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 39

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

divisible by 7.

Page 40: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 40

final List<Integer> numbers = new ArrayList<>();for (int i = 0; i < 100; ++i) { if (i % 7 == 0) { numbers.add(i); }}Integer sum = 0 ;for (final Integer i: numbers) { sum += i * i;}

Page 41: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 41

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

Page 42: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 42

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

Page 43: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 43

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

Page 44: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 44

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

Page 45: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 45

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

Page 46: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 46

numbers.filter(i -> i % 7 == 0).map(i -> i * i).reduce(0, (t, x) -> t + x)

Huh?

Page 47: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 47

final List<Integer> numbers = new ArrayList<>();for (int i = 0; i < 100; ++i) { numbers.add(i); }

Oh ffs.

Page 48: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 48

Higher Order Functions

Page 49: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 49

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

Page 50: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 50

Some may be thinking:Why do I give a f###

Page 51: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 51

After all nothing good has happenedin Java since Java 1.4.2.

Page 52: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 52

Page 53: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 53

Because all computers arenow parallel computers.

Page 54: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 54

Page 55: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 55

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

Page 56: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 56

We have to actually do object-oriented and functional programming.

Page 57: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 57

Instead of just saying we write Java and so are doing object-oriented programming.

Page 58: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 58

numbers.parallel().filter(i -> i % 7 == 0). map(i -> i * i).reduce(0, (t, x) -> t + x)

Page 59: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 59

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

Page 60: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 60

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

Very Java 8.

Page 61: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 61

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

Page 62: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 62

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

Page 63: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 63

GPars and Groovy give you Java 8 styleapproach and parallelism today

for Java with JDK6 or JDK7.

Page 64: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 64

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

Or just install the JDK8 Lambda release.

Page 65: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 65

Using Scala is an option fordoing functional programming*.

*And just ignore Java altogether.

Page 66: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 66

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

Page 67: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 67

An End

Page 68: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 68

Java is about to get the functional programming aspect.

Page 69: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 69

Java is about to becomean object-oriented language.

Page 70: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 70

Scala, Groovy, Python, C++, etc.already have object-oriented and functional.

Page 71: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 71

It's all about how your data evolves.

It's not about the flow of control.

Page 72: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 72

It's all about sending messages to your objects, requesting activity.

Page 73: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 73

Closure the next “big thing” in Java?

Page 74: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 74

Page 75: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 75

Squirrels deny parallelism.

Page 76: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 76

Page 77: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 77

Yes*.

*But will everyone ignore it?

Page 78: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 78

No.

Page 79: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 79

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 defender methods.

Page 80: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 80

Surreptitious Advertisement

Page 81: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 81

The End

Page 82: Closures: The Next "Big Thing" In Java

Copyright © 2012 Russel Winder 82

ClosuresThe Next “Big Thing” in Java?

Russel Winder

email: [email protected]: [email protected]

twitter: @russel_winder