Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java 8: Lambdas, Monads and Java Collections

Java 8: Lambdas, Monads and Java Collections

Presented during Confitura 2015

Grzegorz Piwowarek

July 06, 2015
Tweet

More Decks by Grzegorz Piwowarek

Other Decks in Programming

Transcript

  1. JAVA 8
    LAMBDAS, MONADS && JAVA COLLECTIONS
    Grzegorz Piwowarek

    View Slide

  2. GRZEGORZ PIWOWAREK
    @PIVOVARIT

    View Slide

  3. GRZEGORZ PIWOWAREK
    @PIVOVARIT
    visionsoftondal.com

    View Slide

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

    View Slide

  5. lambda expressions
    (...) -> statement
    - Anonymous function

    View Slide

  6. lambda expressions
    x -> x + 1

    View Slide

  7. lambda expressions
    x -> x + 1
    - No type information

    View Slide

  8. lambda expressions
    x -> x + 1
    () -> 42
    () -> {return 42;}
    (x, y) -> {}
    () -> {}

    View Slide

  9. method references

    View Slide

  10. java.util.function

    View Slide

  11. java.util.function

    View Slide

  12. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction

    View Slide

  13. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction

    View Slide

  14. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction

    View Slide

  15. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction

    View Slide

  16. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction

    View Slide

  17. MONAD

    View Slide

  18. View Slide

  19. GOOGLE IMAGES...

    View Slide

  20. ...

    View Slide

  21. MONAD
    Design pattern
    http://got-steam.com/

    View Slide

  22. Why bother? :
    Boilerplate -1
    Readability +1
    Complexity -1
    Responsibility -1

    View Slide

  23. type: M
    "unit": T -> M
    "bind": M.bind(T -> M) = M
    MONAD
    "bind": M.bind(T -> U)= M

    View Slide

  24. type: M
    "unit": T -> M
    "bind": M bind(T -> M) = M
    MONAD
    "bind": M.bind(T -> U)= M

    View Slide

  25. "bind": M bind(T -> U)= M
    What if U: M> ?

    View Slide

  26. "bind": M bind(T -> U)= M
    What if U: M> ?

    View Slide

  27. "bind": M bind(T -> U)= M
    What if U: M> ?
    http://www.ivanaborovnjak.com/project/box-in-a-box/

    View Slide

  28. Monads in Java 8
    Optional
    Stream
    CompletableFuture

    View Slide

  29. Monads in Java 8
    Optional
    Stream
    CompletableFuture

    View Slide

  30. Optional
    Encapsulation of operations
    on optional values

    View Slide

  31. Optional
    type: M
    "unit": T -> M
    "bind": M bind(T -> M) = M

    View Slide

  32. Optional
    type: Optional
    "unit": T -> M
    "bind": M bind(T -> M) = M

    View Slide

  33. Optional
    type: Optional
    "unit": Optional.ofNullable(), Optional.of()
    "bind": M bind(T -> M) = M

    View Slide

  34. Optional
    type: Optional
    "unit": Optional.ofNullable(), Optional.of()
    "bind": Optional.flatMap()

    View Slide

  35. Filtering an Optional
    .filter(Predicate)

    View Slide

  36. Unwrapping an Optional
    .get()
    .orElse(T default)
    .orElseGet(Supplier)
    .orElseThrow(Supplier)
    .ifPresent(Consumer)

    View Slide

  37. Java 7 style

    View Slide

  38. Java 8 style

    View Slide

  39. Java 8 style - flatMap

    View Slide

  40. Java 7,5 style ;)

    View Slide

  41. Java 7,5 style ;)

    View Slide

  42. Stream
    Encapsulation of operations
    on multiple items

    View Slide

  43. Stream
    type: Stream
    "unit": Stream.of(), Arrays.stream(), Collection.stream()
    "bind": Stream.flatMap()

    View Slide

  44. Stream

    View Slide

  45. Stream

    View Slide

  46. Stream

    View Slide

  47. Stream && Optional

    View Slide

  48. Stream
    lazy-initialized
    nonreusable

    View Slide

  49. intermediate operations
    .map()
    .flatMap()
    .filter()
    .peek()

    View Slide

  50. intermediate operations
    .map()
    .flatMap()
    .filter()
    .peek()
    Stream not consumed:
    does not print anything

    View Slide

  51. Java7

    View Slide

  52. Java8

    View Slide

  53. Consuming Stream
    .forEach(Consumer)
    .collect()
    .reduce(BinaryOperator)
    .allMatch(), anyMatch(), noneMatch()
    .findFirst(), findAny()
    .count()
    .toArray()

    View Slide

  54. Stream.reduce()

    View Slide

  55. Collectors
    .toList(), toMap(), toSet(), toCollection()
    .minBy(), maxBy()
    .joining()
    .partitioningBy()
    ...and many others

    View Slide

  56. Collectors.toList()

    View Slide

  57. Collectors.toMap()

    View Slide

  58. Collectors.joining()

    View Slide

  59. Debuggability?
    IntelliJ IDEA:
    - v14.0 - partial support
    - v15.0 - full support

    View Slide

  60. Stream in APIs
    BufferedReader.lines()
    Files.newDirectoryStream()
    Random.ints()
    ...

    View Slide

  61. you want more?

    View Slide

  62. https://github.com/
    jasongoodwin/better-java-monads

    View Slide

  63. Thank You!

    View Slide

  64. 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

    View Slide