confitura2015 : java8 - lambdas && monads

64
JAVA 8 LAMBDAS, MONADS && JAVA COLLECTIONS Grzegorz Piwowarek

Upload: grzegorz-piwowarek

Post on 11-Aug-2015

98 views

Category:

Education


6 download

TRANSCRIPT

Page 1: Confitura2015 : Java8 - Lambdas && Monads

JAVA 8LAMBDAS, MONADS && JAVA COLLECTIONS

Grzegorz Piwowarek

Page 2: Confitura2015 : Java8 - Lambdas && Monads

GRZEGORZ PIWOWAREK

@PIVOVARIT

Page 3: Confitura2015 : Java8 - Lambdas && Monads

GRZEGORZ PIWOWAREK

@PIVOVARIT

visionsoftondal.com

Page 4: Confitura2015 : Java8 - Lambdas && Monads

Plan:-lambda expressions-java.util.function-monad-Optional-Stream

Page 5: Confitura2015 : Java8 - Lambdas && Monads

lambda expressions

(...) -> statement

- Anonymous function

Page 6: Confitura2015 : Java8 - Lambdas && Monads

lambda expressions

x -> x + 1

Page 7: Confitura2015 : Java8 - Lambdas && Monads

lambda expressions

x -> x + 1

- No type information

Page 8: Confitura2015 : Java8 - Lambdas && Monads

lambda expressions

x -> x + 1 () -> 42

() -> {return 42;} (x, y) -> {}

() -> {}

Page 9: Confitura2015 : Java8 - Lambdas && Monads

method references

Page 10: Confitura2015 : Java8 - Lambdas && Monads

java.util.function

Page 11: Confitura2015 : Java8 - Lambdas && Monads

java.util.function

Page 12: Confitura2015 : Java8 - Lambdas && Monads

Function<T, R>, BiFunction<T,U,R>

Consumer<T> extends Function<T,Void>Supplier<T> extends Function<Void, T>Predicate<T> extends Function<T, Boolean>UnaryOperator<T> extends Function<T, T>BinaryOperator<T> extends BiFunction<T,T,T>

Page 13: Confitura2015 : Java8 - Lambdas && Monads

Function<T, R>, BiFunction<T,U,R>

Consumer<T> extends Function<T,Void>Supplier<T> extends Function<Void, T>Predicate<T> extends Function<T, Boolean>UnaryOperator<T> extends Function<T, T>BinaryOperator<T> extends BiFunction<T,T,T>

Page 14: Confitura2015 : Java8 - Lambdas && Monads

Function<T, R>, BiFunction<T,U,R>

Consumer<T> extends Function<T,Void>Supplier<T> extends Function<Void, T>Predicate<T> extends Function<T, Boolean>UnaryOperator<T> extends Function<T, T>BinaryOperator<T> extends BiFunction<T,T,T>

Page 15: Confitura2015 : Java8 - Lambdas && Monads

Function<T, R>, BiFunction<T,U,R>

Consumer<T> extends Function<T,Void>Supplier<T> extends Function<Void, T>Predicate<T> extends Function<T, Boolean>UnaryOperator<T> extends Function<T, T>BinaryOperator<T> extends BiFunction<T,T,T>

Page 16: Confitura2015 : Java8 - Lambdas && Monads

Function<T, R>, BiFunction<T,U,R>

Consumer<T> extends Function<T,Void>Supplier<T> extends Function<Void, T>Predicate<T> extends Function<T, Boolean>UnaryOperator<T> extends Function<T, T>BinaryOperator<T> extends BiFunction<T,T,T>

Page 17: Confitura2015 : Java8 - Lambdas && Monads

MONAD

Page 18: Confitura2015 : Java8 - Lambdas && Monads
Page 19: Confitura2015 : Java8 - Lambdas && Monads

GOOGLE IMAGES...

Page 20: Confitura2015 : Java8 - Lambdas && Monads

...

Page 21: Confitura2015 : Java8 - Lambdas && Monads

MONAD

Design pattern

http://got-steam.com/

Page 22: Confitura2015 : Java8 - Lambdas && Monads

Why bother? :

Boilerplate -1Readability +1Complexity -1

Responsibility -1

Page 23: Confitura2015 : Java8 - Lambdas && Monads

type: M<T>

"unit": T -> M<T>

"bind": M<T>.bind(T -> M<U>) = M<U>

MONAD

"bind": M<T>.bind(T -> U)= M<U>

Page 24: Confitura2015 : Java8 - Lambdas && Monads

type: M<T>

"unit": T -> M<T>

"bind": M<T> bind(T -> M<U>) = M<U>

MONAD

"bind": M<T>.bind(T -> U)= M<U>

Page 25: Confitura2015 : Java8 - Lambdas && Monads

"bind": M<T> bind(T -> U)= M<U>

What if U: M<?> ?

Page 26: Confitura2015 : Java8 - Lambdas && Monads

"bind": M<T> bind(T -> U)= M<U>

What if U: M<?> ?

Page 27: Confitura2015 : Java8 - Lambdas && Monads

"bind": M<T> bind(T -> U)= M<U>

What if U: M<?> ?

ht tp://www.ivanaborovnjak.com/project/box-in-a-box/

Page 28: Confitura2015 : Java8 - Lambdas && Monads

Monads in Java 8

OptionalStream

CompletableFuture

Page 29: Confitura2015 : Java8 - Lambdas && Monads

Monads in Java 8

OptionalStream

CompletableFuture

Page 30: Confitura2015 : Java8 - Lambdas && Monads

Optional

Encapsulation of operations on optional values

Page 31: Confitura2015 : Java8 - Lambdas && Monads

Optional

type: M<T>

"unit": T -> M<T>

"bind": M<T> bind(T -> M<U>) = M<U>

Page 32: Confitura2015 : Java8 - Lambdas && Monads

Optional

type: Optional<T>

"unit": T -> M<T>

"bind": M<T> bind(T -> M<U>) = M<U>

Page 33: Confitura2015 : Java8 - Lambdas && Monads

Optional

type: Optional<T>

"unit": Optional.ofNullable(), Optional.of()

"bind": M<T> bind(T -> M<U>) = M<U>

Page 34: Confitura2015 : Java8 - Lambdas && Monads

Optional

type: Optional<T>

"unit": Optional.ofNullable(), Optional.of()

"bind": Optional.flatMap()

Page 35: Confitura2015 : Java8 - Lambdas && Monads

Filtering an Optional

.filter(Predicate<T>)

Page 36: Confitura2015 : Java8 - Lambdas && Monads

Unwrapping an Optional

.get()

.orElse(T default)

.orElseGet(Supplier<T>)

.orElseThrow(Supplier<Ex>)

.ifPresent(Consumer<T>)

Page 37: Confitura2015 : Java8 - Lambdas && Monads

Java 7 style

Page 38: Confitura2015 : Java8 - Lambdas && Monads

Java 8 style

Page 39: Confitura2015 : Java8 - Lambdas && Monads

Java 8 style - flatMap

Page 40: Confitura2015 : Java8 - Lambdas && Monads

Java 7,5 style ;)

Page 41: Confitura2015 : Java8 - Lambdas && Monads

Java 7,5 style ;)

Page 42: Confitura2015 : Java8 - Lambdas && Monads

Stream

Encapsulation of operations on multiple items

Page 43: Confitura2015 : Java8 - Lambdas && Monads

Stream

type: Stream<T>

"unit": Stream.of(), Arrays.stream(), Collection.stream()

"bind": Stream.flatMap()

Page 44: Confitura2015 : Java8 - Lambdas && Monads

Stream

Page 45: Confitura2015 : Java8 - Lambdas && Monads

Stream

Page 46: Confitura2015 : Java8 - Lambdas && Monads

Stream

Page 47: Confitura2015 : Java8 - Lambdas && Monads

Stream && Optional

Page 48: Confitura2015 : Java8 - Lambdas && Monads

Stream

lazy-initializednonreusable

Page 49: Confitura2015 : Java8 - Lambdas && Monads

intermediate operations

.map()

.flatMap()

.filter()

.peek()

Page 50: Confitura2015 : Java8 - Lambdas && Monads

intermediate operations

.map()

.flatMap()

.filter()

.peek()

Stream not consumed:

does not print anything

Page 51: Confitura2015 : Java8 - Lambdas && Monads

Java7

Page 52: Confitura2015 : Java8 - Lambdas && Monads

Java8

Page 53: Confitura2015 : Java8 - Lambdas && Monads

Consuming Stream

.forEach(Consumer<T>)

.collect()

.reduce(BinaryOperator<T>)

.allMatch(), anyMatch(), noneMatch()

.findFirst(), findAny()

.count()

.toArray()

Page 54: Confitura2015 : Java8 - Lambdas && Monads

Stream.reduce()

Page 55: Confitura2015 : Java8 - Lambdas && Monads

Collectors

.toList(), toMap(), toSet(), toCollection()

.minBy(), maxBy()

.joining()

.partitioningBy()

...and many others

Page 56: Confitura2015 : Java8 - Lambdas && Monads

Collectors.toList()

Page 57: Confitura2015 : Java8 - Lambdas && Monads

Collectors.toMap()

Page 58: Confitura2015 : Java8 - Lambdas && Monads

Collectors.joining()

Page 59: Confitura2015 : Java8 - Lambdas && Monads

Debuggability?

IntelliJ IDEA:

- v14.0 - partial support

- v15.0 - full support

Page 60: Confitura2015 : Java8 - Lambdas && Monads

Stream in APIs

BufferedReader.lines()

Files.newDirectoryStream()

Random.ints()

...

Page 61: Confitura2015 : Java8 - Lambdas && Monads

you want more?

Page 62: Confitura2015 : Java8 - Lambdas && Monads

https://github.com/

jasongoodwin/better-java-monads

Page 63: Confitura2015 : Java8 - Lambdas && Monads

Thank You!

Page 64: Confitura2015 : Java8 - Lambdas && Monads

REFERENCES:

-"MONADIC JAVA" BY MARIO FUSCO

-"WHAT'S WRONG WITH JAVA 8" BY PIERRE-YVES SAUMONT

-WWW.ORACLE.COM

-"A FISTFUL OF MONADS" - LEARN YOU A HASKELL FOR GREAT GOOD