Grzegorz Piwowarek
gpiwowarek@gmail.com
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
VISIONS OF TONDAL.PL
Why?
//TODO:
-lambda expressions
-java.util.function
-monad
-java.util.Optional
-java.util.stream.Stream
GitHub, Twitter :: @pivovarit
lambda expressions
GitHub, Twitter :: @pivovarit
lambda expressions
(...) -> statement
- Anonymous function
GitHub, Twitter :: @pivovarit
lambda expressions
x -> x + 1
GitHub, Twitter :: @pivovarit
lambda expressions
x -> x + 1
GitHub, Twitter :: @pivovarit
() -> 42
lambda expressions
x -> x + 1
GitHub, Twitter :: @pivovarit
() -> 42
() -> {return 42;}
lambda expressions
x -> x + 1
GitHub, Twitter :: @pivovarit
() -> 42
(x, y) -> {}
() -> {return 42;}
lambda expressions
x -> x + 1
- No type information
GitHub, Twitter :: @pivovarit
method references
GitHub, Twitter :: @pivovarit
java.util.function
GitHub, Twitter :: @pivovarit
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>
GitHub, Twitter :: @pivovarit
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>
GitHub, Twitter :: @pivovarit
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>
GitHub, Twitter :: @pivovarit
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>
GitHub, Twitter :: @pivovarit
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>
GitHub, Twitter :: @pivovarit
MONAD
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
GOOGLE IMAGES...
...
GitHub, Twitter :: @pivovarit
MONAD
Design pattern
http://got-steam.com/
GitHub, Twitter :: @pivovarit
Why bother? :
Boilerplate--
Readability++
Complexity--
GitHub, Twitter :: @pivovarit
Imperative approach
GitHub, Twitter :: @pivovarit
Declarative approach
GitHub, Twitter :: @pivovarit
Generic type:
"unit" method:
"bind" method:
MONAD
GitHub, Twitter :: @pivovarit
Generic type:
"unit" method:
"bind" method:
MONAD
GitHub, Twitter :: @pivovarit
Generic type:
"unit" method:
"bind" method:
MONAD
GitHub, Twitter :: @pivovarit
Generic type:
"unit" method:
"bind" method:
MONAD
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
http://www.ivanaborovnjak.com/project/box-in-a-box/
GitHub, Twitter :: @pivovarit
Solution
GitHub, Twitter :: @pivovarit
Monads in Java 8
Optional
Stream
CompletableFuture
GitHub, Twitter :: @pivovarit
Monads in Java 8
Optional
Stream
CompletableFuture
GitHub, Twitter :: @pivovarit
Optional
Encapsulation of operations
on optional values
GitHub, Twitter :: @pivovarit
Optional
Encapsulation of operations
on optional values
GitHub, Twitter :: @pivovarit
Optional
type:
"unit":
"bind":
GitHub, Twitter :: @pivovarit
Optional
type: Optional<T>
"unit":
"bind":
GitHub, Twitter :: @pivovarit
Optional
type: Optional<T>
"unit": Optional.ofNullable(), Optional.of()
"bind":
GitHub, Twitter :: @pivovarit
Optional
type: Optional<T>
"unit": Optional.ofNullable(), Optional.of()
"bind": Optional.flatMap(), Optional.map()
GitHub, Twitter :: @pivovarit
Filtering an Optional
.filter(Predicate<T>)
GitHub, Twitter :: @pivovarit
Unwrapping an Optional
.get()
.orElse(T default)
.orElseGet(Supplier<T>)
.orElseThrow(Supplier<Ex>)
.ifPresent(Consumer<T>)
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
http://theworryfreelife.com/wp-content/uploads/2015/08/comfort-zone.jpg
Java 7 style
GitHub, Twitter :: @pivovarit
Java 8 style
GitHub, Twitter :: @pivovarit
Java 7,5 style ;)
GitHub, Twitter :: @pivovarit
Java 7,5 style ;)
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
GitHub, Twitter :: @pivovarit
Stream
Encapsulation of operations
on multiple items
GitHub, Twitter :: @pivovarit
Stream
type: Stream<T>
"unit": Stream.of(), Arrays.stream(), Collection.stream()
"bind": Stream.flatMap()
GitHub, Twitter :: @pivovarit
Stream
GitHub, Twitter :: @pivovarit
Stream
GitHub, Twitter :: @pivovarit
Stream
GitHub, Twitter :: @pivovarit
Imperative vs. Declarative
GitHub, Twitter :: @pivovarit
Imperative vs. Declarative
GitHub, Twitter :: @pivovarit
Stream && Optional
GitHub, Twitter :: @pivovarit
Stream
lazy-initialized
nonreusable
GitHub, Twitter :: @pivovarit
intermediate operations
.map()
.flatMap()
.filter()
.peek()
GitHub, Twitter :: @pivovarit
intermediate operations
.map()
.flatMap()
.filter()
.peek()
Stream not consumed:
does not print anything
GitHub, Twitter :: @pivovarit
Consuming Stream
.forEach(Consumer<T>)
.collect()
.reduce(BinaryOperator<T>)
.allMatch(), anyMatch(), noneMatch()
.findFirst(), findAny()
.count()
.toArray()
GitHub, Twitter :: @pivovarit
Stream.reduce()
GitHub, Twitter :: @pivovarit
Collectors
.toList(), toMap(), toSet(), toCollection()
.minBy(), maxBy()
.joining()
.partitioningBy()
...and many others
GitHub, Twitter :: @pivovarit
Collectors.toList()
GitHub, Twitter :: @pivovarit
Stream in APIs
"any string".chars()
Files.newDirectoryStream()
Random.ints()
...
GitHub, Twitter :: @pivovarit
you want more?
GitHub, Twitter :: @pivovarit
github.com/
TouK/ThrowingFunction
http://www.javaslang.io/
GitHub, Twitter :: @pivovarit
Thank You!
GitHub, Twitter :: @pivovarit
REFERENCES:
-"MONADICJAVA" 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

4Developers: Grzegorz Piwowarek- Java Wars VIII: The Function Awakens