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

Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Embed Size (px)

Citation preview

Page 1: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

JAVA 8LAMBDAS, MONADS && JAVA COLLECTIONS

Grzegorz Piwowarek

Page 2: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

GRZEGORZ PIWOWAREK

@PIVOVARIT

Page 3: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

GRZEGORZ PIWOWAREK

@PIVOVARIT

visionsoftondal.com

Page 4: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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

Page 5: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

lambda expressions

(...) -> statement

- Anonymous function

Page 6: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

lambda expressions

x -> x + 1

Page 7: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

lambda expressions

x -> x + 1

- No type information

Page 8: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

lambda expressions

x -> x + 1 () -> 42

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

() -> {}

Page 9: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

method references

Page 10: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

java.util.function

Page 11: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

java.util.function

Page 12: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

java.util.function

Page 13: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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 18: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

MONAD

Page 19: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator
Page 20: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

GOOGLE IMAGES...

Page 21: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

...

Page 22: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

MONAD

Design pattern

Page 23: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

MONAD

Design pattern

http://got-steam.com/

Page 24: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Why bother? :

Boilerplate -1Readability +1Complexity -1

Responsibility -1

Page 25: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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 26: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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 27: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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

What if U: M<?> ?

Page 28: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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

What if U: M<?> ?

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

Page 29: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

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

What if U: M<?> ?

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

Page 30: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Monads in Java 8

OptionalStream

CompletableFuture

Page 31: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Monads in Java 8

OptionalStream

CompletableFuture

Page 32: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Optional

Encapsulation of operations on optional values

Page 33: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Optional

type: M<T>

"unit": T -> M<T>

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

Page 34: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Optional

type: Optional<T>

"unit": T -> M<T>

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

Page 35: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Optional

type: Optional<T>

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

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

Page 36: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Optional

type: Optional<T>

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

"bind": Optional.flatMap()

Page 37: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Filtering an Optional

.filter(Predicate<T>)

Page 38: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Unwrapping an Optional

.get()

.orElse(T default)

.orElseGet(Supplier<T>)

.orElseThrow(Supplier<Ex>)

.ifPresent(Consumer<T>)

Page 39: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java 7 style

Page 40: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java 8 style

Page 41: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java 8 style - flatMap

Page 42: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java 7,5 style ;)

Page 43: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java 7,5 style ;)

Page 44: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream

Encapsulation of operations on multiple items

Page 45: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream

type: Stream<T>

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

"bind": Stream.flatMap()

Page 46: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream

lazy-initializednonreusable

Page 47: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java7

Page 48: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Java8

Page 49: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream && Optional

Page 50: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

intermediate operations

.map()

.flatMap()

.filter()

.peek()

Page 51: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

intermediate operations

.map()

.flatMap()

.filter()

.peek()

Stream not consumed:

does not print anything

Page 52: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Consuming Stream

.forEach(Consumer<T>)

.collect()

.reduce(BinaryOperator<T>)

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

.findFirst(), findAny()

.count()

.toArray()

Page 53: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream.reduce()

Page 54: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Collectors

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

.minBy(), maxBy()

.joining()

.partitioningBy()

...and many others

Page 55: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Collectors.toList()

Page 56: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Collectors.toMap()

Page 57: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Collectors.joining()

Page 58: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Stream in APIs

BufferedReader.lines()

Files.newDirectoryStream()

Random.ints()

...

Page 59: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

you want more?

Page 60: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

https://github.com/

jasongoodwin/better-java-monads

Page 61: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

Thank You!

Page 62: Java 8: Lambdas, Monads and Java Collections - 12.05.2015 @JInkubator

REFERENCES:

-MONADIC JAVA BY MARIO FUSCO

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

-WWW.ORACLE.COM