Más contenido relacionado
Similar a Java 8: a New Beginning (10)
Más de Russel Winder (20)
Java 8: a New Beginning
- 1. Java 8
A New Beginning
Russel Winder
email: russel@winder.org.uk
xmpp: russel@winder.org.uk
twitter: @russel_winder
Web: http://www.russel.org.uk
Copyright © 2013 Russel Winder 1
- 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 2
- 3. Structure
A Beginning
A Middle
An End
Copyright © 2013 Russel Winder 3
- 7. They see no reason to move to any
later version of Java:
no real benefit, for too much pain.
Copyright © 2013 Russel Winder 7
- 8. Java 5 is a barrier too far for them.
Copyright © 2013 Russel Winder 8
- 9. The Java 7 → Java 8 change
is an even more disruptive change.
Copyright © 2013 Russel Winder 9
- 11. No, it's an opportunity to stop
programming using 1970s techniques
and start using 1930s ones.
Copyright © 2013 Russel Winder 11
- 12. Alonzo Church
Stephen Kleene
J B Rosser
Alan Turing
Copyright © 2013 Russel Winder 12
- 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 14
- 15. What's (Quite) Interesting in Java 8?
● G1 garbage collector. ● Lambda expressions.
● Nashorn. ● Enhanced collections.
● JavaFX.
Copyright © 2013 Russel Winder 15
- 17. Nashorn comes as standard:
Server-side JavaScript without Rhino.
Copyright © 2013 Russel Winder 17
- 18. JavaFX in the distribution and the classpath:
You probably want to use GroovyFX though.
Copyright © 2013 Russel Winder 18
- 21. A closure is a function with an associated
environment containing values for all the free
variables in the function.
Copyright © 2013 Russel Winder 21
- 22. A Function
Integer f(final Integer x) {
return x * y ;
}
Free variable.
Copyright © 2013 Russel Winder 22
- 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 23
- 24. Java has had things (sort of) like this
since (almost) the beginning…
Copyright © 2013 Russel Winder 24
- 25. A closure can be realized as an instance of
a class with a single method and
single assignment fields.
Copyright © 2013 Russel Winder 25
- 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 26
- 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 29
- 30. Java has accreted a reputation for being verbose.
Copyright © 2013 Russel Winder 30
- 32. Or Python, D, C++ (!), etc.
Copyright © 2013 Russel Winder 32
- 33. final multiplyBy5 = {i -> 5 * i}
final multiplyBy5 = {5 * it}
multiplyBy5(4)
multiplyBy5.call(4)
Copyright © 2013 Russel Winder 33
- 35. How to do all this stuff in Java whilst
keeping backward compatibility?
Copyright © 2013 Russel Winder 35
- 37. Do not use anonymous classes.
Copyright © 2013 Russel Winder 37
- 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 42
- 44. …true (sort of), but that isn't all there is…
Copyright © 2013 Russel Winder 44
- 46. It all about where the iteration is.
Copyright © 2013 Russel Winder 46
- 48. Work with a (trivial) example:
Copyright © 2013 Russel Winder 48
- 49. Calculate the sum of the squares of the
numbers between 0 and 100 that are
divisible by 7.
Copyright © 2013 Russel Winder 49
- 50. int sum = 0;
for (int i = 0; i < 100; ++i) {
if (i % 7 == 0) {
sum += i * i;
}
}
Copyright © 2013 Russel Winder 50
- 51. (for (i <- 0 until 100; if i % 7 == 0) yield i * i).sum
Copyright © 2013 Russel Winder 51
- 52. sum({for (i in 0..100) if (i % 7 == 0) i * i})
Copyright © 2013 Russel Winder 52
- 53. sum(i * i for i in range(100) if i % 7 == 0)
Copyright © 2013 Russel Winder 53
- 61. Functions that take functions as parameters
and/or return functions as result.
Copyright © 2013 Russel Winder 61
- 62. Some may be thinking:
Why do I give a f###?
Copyright © 2013 Russel Winder 62
- 63. After all nothing good has happened
in Java since Java 1.4.2.
Copyright © 2013 Russel Winder 63
- 67. We have to move to an attitude where we
assume our software is not uniprocessor.
Copyright © 2013 Russel Winder 67
- 68. We have to actually do object-oriented
and functional programming.
Copyright © 2013 Russel Winder 68
- 69. Instead of just saying we write code using
Java, C++, etc. and so must be
doing object-oriented programming.
Copyright © 2013 Russel Winder 69
- 73. GParsPool.withPool {
(0..100).findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()
}
Copyright © 2013 Russel Winder 73
- 74. GParsPool.withPool {
(0..100).parallel.filter{it % 7 == 0}.map{it * it}.sum()
}
Copyright © 2013 Russel Winder 74
- 75. def value = (0..100)
ParallelEnhancer.enhanceInstance(value)
value = value.parallel.filter{it % 7 == 0}.map{it * it}.sum()
Copyright © 2013 Russel Winder 75
- 76. def value = (0..100)
ParallelEnhancer.enhanceInstance(value)
value = value.findAllParallel{it % 7 == 0}.collectParallel{it * it}.sum()
Copyright © 2013 Russel Winder 76
- 77. GPars and Groovy give you Java 8 style
approach and parallelism today
for Java with JDK6 or JDK7.
Copyright © 2013 Russel Winder 77
- 78. Guava, TotallyLazy, and FunctionalJava can be used
today to practice the functional approach using Java.
Copyright © 2013 Russel Winder 78
- 79. Using Scala is an option for
doing functional programming*.
Copyright © 2013 Russel Winder
*And just ignore Java altogether. 79
- 81. Or just install the JDK8 Lambda release.
Copyright © 2013 Russel Winder 81
- 84. What is the Value of ?
Easy, it's known exactly.
It's .
Obviously.
Copyright © 2013 Russel Winder 84
- 85. It's simples
Александр Орлов 2009
Copyright © 2013 Russel Winder 85
- 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.
1 1
=∫0 dx
4 1x 2
Copyright © 2013 Russel Winder 86
- 87. One Possible Algorithm
● Use quadrature to estimate the value of the integral
– which is the area under the curve.
4 n 1
= ∑i=1
n i−0.5 2
Embarrassingly 1
parallel. n
With n = 3 not much to do,
but potentially lots of error.
Use n = 107 or n = 109?
Copyright © 2013 Russel Winder 87
- 88. Because addition is commutative and
associative, expression can be
decomposed into sums of partial sums.
Copyright © 2013 Russel Winder 88
- 89. a+b+c+d+e+f
=
(a+b)+(c+d)+(e+f)
Copyright © 2013 Russel Winder 89
- 93. Java is about to get the functional
programming approach.
Copyright © 2013 Russel Winder 93
- 94. Scala, Groovy, Kotlin, Ceylon,
Python, D, C++, etc.
already have object-oriented
and functional*.
* Well Scala has.
Copyright © 2013 Russel Winder 94
- 95. It's all about how your data evolves.
It's not about the flow of control.
Copyright © 2013 Russel Winder 95
- 97. Yes*.
*But will everyone ignore it?
Copyright © 2013 Russel Winder 97
- 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 99
- 102. Java 8
A New Beginning
Russel Winder
email: russel@winder.org.uk
xmpp: russel@winder.org.uk
twitter: @russel_winder
Web: http://www.russel.org.uk/
Copyright © 2013 Russel Winder 102