Está en la página 1de 75

Functional Java 8

This Aint Your Daddys JDK

Nick Maiorano
ThoughtFlow Solutions1 Inc.
About me

Developer

Software
Architect

Independent
Consultant
ThoughtFlow Solutions

Functional Java 8 This Aint Your Daddys JDK 2


Available April 2014

Functional Java 8 This Aint Your Daddys JDK 3


Functional Java 8 This Aint Your Daddys JDK 4
Whats in Java 8?
Encoding
Encryption enhancements
Functional
libraries
Concurrency updates

Modularization
Repeating
New
annotations
Date/Time
Concurrency API
updates

Java 8
Lambdas
GC
updates
Nashorn
JavaScript
Engine
Church
Performance Collections
improvements

Functional Java 8 This Aint Your Daddys JDK 5


Whats in Java 8?

Functional Concurrency
libraries

Java 8
Lambdas

Church Collections

Functional Java 8 This Aint Your Daddys JDK 6


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 Aint Your Daddys JDK 7


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 Aint Your Daddys JDK 8


Functional Programming
Rooted in lambda calculus
Hastened by death of Moores law
Programming paradigm of the times

Functional Java 8 This Aint Your Daddys JDK 9


Java DNA

Structured Reflective Object


Imperative Concurrent Generic
Oriented Generic
Java DNA

Structured Reflective Object


Functional Imperative Concurrent Generic
Oriented Generic
Organization

Java Classes

Vs.

FP Functions

Functional Java 8 This Aint Your Daddys JDK 12


Building blocks

Polymorphism, encapsulation,
Java inheritance, dynamic binding

Vs.

Higher-order functions, currying,


FP monads, list comprehensions

Functional Java 8 This Aint Your Daddys JDK 13


Algorithmic style

Imperative: define behaviour as a


Java series of steps

Vs.
Declarative: binding functions together
FP without necessarily specifying their
contents

Functional Java 8 This Aint Your Daddys JDK 14


State management

Java Put state and behaviour together

Vs.

FP Avoid state

Functional Java 8 This Aint Your Daddys JDK 15


Mutability

Java Supports mutability & immutability

Vs.

FP Emphasis on immutability

Functional Java 8 This Aint Your Daddys JDK 16


Design patterns

Relies on design patterns to


Java complement OOP for a higher level of
abstraction
Vs.

FP Is already a higher level abstraction

Functional Java 8 This Aint Your Daddys JDK 17


Concurrency

Use multi-threading, control access to


Java shared resources via locks

Vs.
Organize processing into parallel workflows
FP each dedicated to a core and avoid state,
shared resources and locks

Functional Java 8 This Aint Your Daddys JDK 18


Recursion

Java Supported with limitations

Vs.

FP Rudimentary

Functional Java 8 This Aint Your Daddys JDK 19


Expressiveness

Java Clear & verbose

Vs.

FP Concise & dense

Functional Java 8 This Aint Your Daddys JDK 20


Functional Java

Is a blend of imperative and object


oriented programming enhanced
with functional flavors

Functional Java 8 This Aint Your Daddys JDK 21


Functional Java 8 This Aint Your Daddys JDK 22
New Syntax
Lambdas
Functional interfaces
Method references
Default methods

Functional Java 8 This Aint Your Daddys JDK 23


Whats a lambda?

Functional Java 8 This Aint Your Daddys JDK 24


Anatomy of the lambda
Behavior-as-data facilitators
On-the-fly code definers
Ground-floor of FP

Functional Java 8 This Aint Your Daddys JDK 25


Anatomy of the lambda

Lambda blocks
(Parameter declaration) -> {Lambda body}

(Integer i) -> {System.out.println(i);};

Functional Java 8 This Aint Your Daddys JDK 26


Anatomy of the lambda

Lambda blocks
(Parameter declaration) -> {Lambda body}

(Integer i) -> {System.out.println(i);};

Functional Java 8 This Aint Your Daddys JDK 27


Anatomy of the lambda

Lambda expressions
Parameter name -> Lambda expression

(Integer i) -> {System.out.println(i);};

Functional Java 8 This Aint Your Daddys JDK 28


Anatomy of the lambda

Lambda expressions
Parameter name -> Lambda expression

i -> System.out.println(i);

Functional Java 8 This Aint Your Daddys JDK 29


Anatomy of the lambda

Lambda expressions
Parameter name -> single statement;

i -> i * 2; No return statement

Functional Java 8 This Aint Your Daddys JDK 30


Functional Interfaces
Lambdas are backed by interfaces
Single abstract methods
@FunctionalInterface

Functional Java 8 This Aint Your Daddys JDK 31


Functional Interfaces

@FunctionalInterface
public interface Calculator
{
int calculate(int x, int y);
}

Functional Java 8 This Aint Your Daddys JDK 32


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 Aint Your Daddys JDK 33


Functional Interfaces
Over 40 functional interfaces in JDK 8
Rarely need to define your own
Generic and specialized

Functional Java 8 This Aint Your Daddys JDK 34


Functional Interfaces
Consumer<T>
Consumer
void accept(T t);

Supplier<T>
Functional Function <T, R>
Supplier Function
T get() Interfaces R apply(T t);

Predicate

Predicate<T>
boolean test(T t);

Functional Java 8 This Aint Your Daddys JDK 35


Method References

Calculator maxFinder = (x, y) -> Math.max(x, y);

Functional Java 8 This Aint Your Daddys JDK 36


Method References

Calculator maxFinder = Math::max;

Math int max(int a, int b);


Calculator int calculate(int x, int y);

Functional Java 8 This Aint Your Daddys JDK 37


Method References
Type Template
Static Class::method
Instance instanceVariable::method
Constructor Class::new
Super super::method
Generic constructor Class<Type>::new
Array Class[]::new

Functional Java 8 This Aint Your Daddys JDK 38


Anonymous classes?
Do we still need anonymous classes?
Lambdas are behavior-only no state
Only single abstract methods

Functional Java 8 This Aint Your Daddys JDK 39


Default Methods

@FunctionalInterface
public interface Calculator
{
int calculate(int x, int y);

default int multiply(int x, int y)


{
return x * y;
}
}

Functional Java 8 This Aint Your Daddys JDK 40


Default Methods
Can be overloaded
Can be static or instance based
Introduce multiple inheritance

Functional Java 8 This Aint Your Daddys JDK 41


Functional Java 8 This Aint Your Daddys JDK 42
Java-style functional programming
Functional Other languages support FP natively
interfaces Java supports FP through libraries

Functional
Java

Streams Collections

Functional Java 8 This Aint Your Daddys JDK 43


Functionalized Collections

Functional Java 8 This Aint Your Daddys JDK 44


Functionalized Lists

List<String> stooges =
Arrays.asList("Larry", "Moe", "Curly");

stooges.forEach(s -> System.out.println(s);

Functional Java 8 This Aint Your Daddys JDK 45


Functionalized Lists

List<String> stooges =
Arrays.asList("Larry", "Moe", "Curly");

stooges.forEach(System.out::println);

Functional Java 8 This Aint Your Daddys JDK 46


Functionalized Lists

Function<String, String> feminize =


s -> "Larry".equals(s) ? "Lara" :
"Moe".equals(s) ? "Maude" : "Shirley";

stooges.replaceAll(feminize);

Functional Java 8 This Aint Your Daddys JDK 47


Functionalized Lists

Predicate<String> moeRemover =
s -> Moe".equals(s);

stooges.removeIf(moeRemover);

Functional Java 8 This Aint Your Daddys JDK 48


Functionalized Maps

Map<Integer, List<String>> movieDb = new HashMap<>();

movieDb.computeIfAbsent(1930, k -> new LinkedList<>());

movieDb.compute(1930, (k, v) -> { v.add(Soup to nuts);


return v;});

Functional Java 8 This Aint Your Daddys JDK 49


Functionalized Maps

movieDb.putIfAbsent
(1930, new LinkedList<>());

movieDb.getOrDefault
(1930, new LinkedList<>());

Functional Java 8 This Aint Your Daddys JDK 50


Streams

Functional Java 8 This Aint Your Daddys JDK 51


Streams

Lambda Lambda Lambda Lambda

Stream Operation 1 Operation 2 Operation 3 Operation 4

Functional Java 8 This Aint Your Daddys JDK 52


Streams
Build

Peek Filter

Stream
operations

Iterate Map

Reduce

Functional Java 8 This Aint Your Daddys JDK 53


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 Aint Your Daddys JDK 54


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 Aint Your Daddys JDK 55


Streams
Declarative constructs
Can abstract any imperative for/while loop
Work best when adhering to FP principles
Easily parallelizable

Functional Java 8 This Aint Your Daddys JDK 56


Parallel 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 Aint Your Daddys JDK 57


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 Aint Your Daddys JDK 58


Parallel Streams

Functional Java 8 This Aint Your Daddys JDK 59


Parallel Streams

Functional Java 8 This Aint Your Daddys JDK 60


Parallel Streams
Uses fork-join used under the hood
Thread pool sized to # cores
Order can be changed

Functional Java 8 This Aint Your Daddys JDK 61


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 Aint Your Daddys JDK 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;
}

List<Long> perfectNumbers =
LongStream.rangeClosed(1, 8192).
filter(PerfectNumberFinder::isPerfect).
collect(ArrayList<Long>::new, ArrayList<Long>::add, ArrayList<Long>::addAll);

Functional Java 8 This Aint Your Daddys JDK 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).parallel().
filter(PerfectNumberFinder::isPerfect).
collect(ArrayList<Long>::new, ArrayList<Long>::add, ArrayList<Long>::addAll);

Functional Java 8 This Aint Your Daddys JDK 64


Parallel Streams
Serial Parallel
Imperative Stream Stream
8,128 0 1 0
33,550,336 190 229 66
8,589,869,056 48648 59646 13383
137,438,691,328 778853 998776 203651

Functional Java 8 This Aint Your Daddys JDK 65


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
Cant modify local variables (unlike for loops)

Functional Java 8 This Aint Your Daddys JDK 66


Streams (the good)
Allow abstraction of details
Communicate intent clearly
Concise
On-demand parallelization

Functional Java 8 This Aint Your Daddys JDK 67


Streams (the bad)
Loss of flexibility and control
Increased code density
Can be less efficient
On-demand parallelization

Functional Java 8 This Aint Your Daddys JDK 68


Functional Java 8 This Aint Your Daddys JDK 69
Final thoughts on
Java 8

Functional Java 8 This Aint Your Daddys JDK 70


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 Aint Your Daddys JDK 71


How good is functional Java?
FP integrated cohesively & coherently
New tools available for the masses

Functional Java 8 This Aint Your Daddys JDK 72


Available at Amazon April 2014

Functional Java 8 This Aint Your Daddys JDK 73


@ThoughtFlow_Inc

Functional Java 8 This Aint Your Daddys JDK 74


Questions

Functional Java 8 This Aint Your Daddys JDK 75

También podría gustarte