5. What’s in Java 8?
Encoding
enhancements
Encryption
updates
Functional
libraries
Concurrency
Modularization
Repeating
annotations
New
Date/Time
API
Concurrency
updates
Java 8
Lambdas
Nashorn
JavaScript
Engine
Church
Performance
improvements
Functional Java 8 – This Ain’t Your Daddy’s JDK
GC
updates
Collections
5
6. What’s in Java 8?
Functional
libraries
Concurrency
Java 8
Lambdas
Church
Functional Java 8 – This Ain’t Your Daddy’s JDK
Collections
6
7. The rocky road to lambdas
•
•
•
•
•
•
Lambdas too difficult in late 1990s
BGGA project initiated in 2007
JSR 335 filed in late 2009
Had to fit type system
Maintain backward compatibility
Java community divided
Functional Java 8 – This Ain’t Your Daddy’s JDK
7
8. The rocky road to lambdas
•
•
•
•
To be released as part of Java 7
To be released in September 2013
To be released in March 2014
Completing 7 years of work
Functional Java 8 – This Ain’t Your Daddy’s JDK
8
9. Functional Programming
• Rooted in lambda calculus
• Hastened by death of Moore’s law
• Programming paradigm of the times
Functional Java 8 – This Ain’t Your Daddy’s JDK
9
14. Algorithmic style
Java
Imperative: define behaviour as a
series of steps
Vs.
FP
Functional Java 8 – This Ain’t Your Daddy’s JDK
Declarative: binding functions together
without necessarily specifying their
contents
14
15. State management
Java
Put state and behaviour together
Vs.
FP
Functional Java 8 – This Ain’t Your Daddy’s JDK
Avoid state
15
17. Design patterns
Java
Relies on design patterns to
complement OOP for a higher level of
abstraction
Vs.
FP
Functional Java 8 – This Ain’t Your Daddy’s JDK
Is already a higher level abstraction
17
18. Concurrency
Java
Use multi-threading, control access to
shared resources via locks
Vs.
FP
Functional Java 8 – This Ain’t Your Daddy’s JDK
Organize processing into parallel workflows
each dedicated to a core and avoid state,
shared resources and locks
18
21. Functional Java
“…Is a blend of imperative and object
oriented programming enhanced
with functional flavors”
Functional Java 8 – This Ain’t Your Daddy’s JDK
21
25. Anatomy of the lambda
• Behavior-as-data facilitators
• On-the-fly code definers
• Ground-floor of FP
Functional Java 8 – This Ain’t Your Daddy’s JDK
25
26. Anatomy of the lambda
Lambda blocks
(Parameter declaration) -> {Lambda body}
(Integer i) -> {System.out.println(i);};
Functional Java 8 – This Ain’t Your Daddy’s JDK
26
27. Anatomy of the lambda
Lambda blocks
(Parameter declaration) -> {Lambda body}
(Integer i) -> {System.out.println(i);};
Functional Java 8 – This Ain’t Your Daddy’s JDK
27
28. Anatomy of the lambda
Lambda expressions
Parameter name -> Lambda expression
(Integer i) -> {System.out.println(i);};
Functional Java 8 – This Ain’t Your Daddy’s JDK
28
29. Anatomy of the lambda
Lambda expressions
Parameter name -> Lambda expression
i -> System.out.println(i);
Functional Java 8 – This Ain’t Your Daddy’s JDK
29
30. Anatomy of the lambda
Lambda expressions
Parameter name -> single statement;
i -> i * 2;
Functional Java 8 – This Ain’t Your Daddy’s JDK
No return statement
30
31. Functional Interfaces
• Lambdas are backed by interfaces
• Single abstract methods
• @FunctionalInterface
Functional Java 8 – This Ain’t Your Daddy’s JDK
31
33. Functional Interfaces
Calculator multiply = (x, y) -> x * y;
Calculator divide = (x, y) -> x / y;
int product = multiply.calculate(10, 20);
int quotient = divide.calculate(10, 20);
someMethod(multiply, divide);
anotherMethod((x, y) -> x ^ y);
Functional Java 8 – This Ain’t Your Daddy’s JDK
33
34. Functional Interfaces
• Over 40 functional interfaces in JDK 8
• Rarely need to define your own
• Generic and specialized
Functional Java 8 – This Ain’t Your Daddy’s JDK
34
37. Method References
Calculator maxFinder = Math::max;
Math
Calculator
int max(int a, int b);
int calculate(int x, int y);
Functional Java 8 – This Ain’t Your Daddy’s JDK
37
39. Anonymous classes?
• Do we still need anonymous classes?
• Lambdas are behavior-only – no state
• Only single abstract methods
Functional Java 8 – This Ain’t Your Daddy’s JDK
39
41. Default Methods
• Can be overloaded
• Can be static or instance based
• Introduce multiple inheritance
Functional Java 8 – This Ain’t Your Daddy’s JDK
41
54. Streams
private static boolean isPerfect(long n)
{
long sum = 0;
for (long i = 1; i <= n / 2; i++)
{
if (n % i == 0)
{
sum += i;
}
}
return sum == n;
}
Functional Java 8 – This Ain’t Your Daddy’s JDK
54
55. Streams
private static boolean isPerfect(long n)
{
return n > 0 &&
LongStream.rangeClosed(1, n / 2).
filter(i -> n % i == 0).
reduce(0, (l, r) -> l + r) == n;
}
Functional Java 8 – This Ain’t Your Daddy’s JDK
55
61. Parallel Streams
• Uses fork-join used under the hood
• Thread pool sized to # cores
• Order can be changed
Functional Java 8 – This Ain’t Your Daddy’s JDK
61
62. Parallel Streams
private static boolean isPerfect(long n)
{
return n > 0 &&
LongStream.rangeClosed(1, n / 2). parallel().
filter(i -> n % i == 0).
reduce(0, (l, r) -> l + r) == n;
}
Functional Java 8 – This Ain’t Your Daddy’s JDK
62
63. Parallel Streams
private static boolean isPerfect(long n)
{
return n > 0 &&
LongStream.rangeClosed(1, n / 2). parallel().
filter(i -> n % i == 0).
reduce(0, (l, r) -> l + r) == n;
}
List<Long> perfectNumbers =
LongStream.rangeClosed(1, 8192).
filter(PerfectNumberFinder::isPerfect).
collect(ArrayList<Long>::new, ArrayList<Long>::add, ArrayList<Long>::addAll);
Functional Java 8 – This Ain’t Your Daddy’s JDK
63
64. Parallel Streams
private static boolean isPerfect(long n)
{
return n > 0 &&
LongStream.rangeClosed(1, n / 2). parallel().
filter(i -> n % i == 0).
reduce(0, (l, r) -> l + r) == n;
}
List<Long> perfectNumbers =
LongStream.rangeClosed(1, 8192).parallel().
filter(PerfectNumberFinder::isPerfect).
collect(ArrayList<Long>::new, ArrayList<Long>::add, ArrayList<Long>::addAll);
Functional Java 8 – This Ain’t Your Daddy’s JDK
64
66. Parallelization
• Must avoid side-effects and mutating state
• Problems must fit the associativity property
• Ex: ((a * b) * c) = (a * (b * c))
• Must be enough parallelizable code
• Performance not always better
• Can’t modify local variables (unlike for loops)
Functional Java 8 – This Ain’t Your Daddy’s JDK
66
67. Streams (the good)
•
•
•
•
Allow abstraction of details
Communicate intent clearly
Concise
On-demand parallelization
Functional Java 8 – This Ain’t Your Daddy’s JDK
67
68. Streams (the bad)
•
•
•
•
Loss of flexibility and control
Increased code density
Can be less efficient
On-demand parallelization
Functional Java 8 – This Ain’t Your Daddy’s JDK
68
71. How good is functional Java?
•
•
•
•
•
•
Java now supports functional constructs
But still OO at its core
Functional expressions a little clunky
Generics require more mental agility
Conciseness is compromised
Recursion not industrial strength
Functional Java 8 – This Ain’t Your Daddy’s JDK
71
72. How good is functional Java?
• FP integrated cohesively & coherently
• New tools available for the masses
Functional Java 8 – This Ain’t Your Daddy’s JDK
72
73. Available at Amazon April 2014
Functional Java 8 – This Ain’t Your Daddy’s JDK
73