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

Java Wars VIII: The Function Awakens

Java Wars VIII: The Function Awakens

Grzegorz Piwowarek

April 11, 2016
Tweet

More Decks by Grzegorz Piwowarek

Other Decks in Programming

Transcript

  1. Grzegorz Piwowarek
    [email protected]

    View Slide

  2. GitHub, Twitter :: @pivovarit

    View Slide

  3. GitHub, Twitter :: @pivovarit
    VISIONS OF TONDAL.PL

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. Why?

    View Slide

  9. //TODO:
    -lambda expressions
    -java.util.function
    -monad
    -java.util.Optional
    -java.util.stream.Stream
    GitHub, Twitter :: @pivovarit

    View Slide

  10. lambda expressions
    GitHub, Twitter :: @pivovarit

    View Slide

  11. lambda expressions
    (...) -> statement
    - Anonymous function
    GitHub, Twitter :: @pivovarit

    View Slide

  12. lambda expressions
    x -> x + 1
    GitHub, Twitter :: @pivovarit

    View Slide

  13. lambda expressions
    x -> x + 1
    GitHub, Twitter :: @pivovarit
    () -> 42

    View Slide

  14. lambda expressions
    x -> x + 1
    GitHub, Twitter :: @pivovarit
    () -> 42
    () -> {return 42;}

    View Slide

  15. lambda expressions
    x -> x + 1
    GitHub, Twitter :: @pivovarit
    () -> 42
    (x, y) -> {}
    () -> {return 42;}

    View Slide

  16. lambda expressions
    x -> x + 1
    - No type information
    GitHub, Twitter :: @pivovarit

    View Slide

  17. method references
    GitHub, Twitter :: @pivovarit

    View Slide

  18. java.util.function
    GitHub, Twitter :: @pivovarit

    View Slide

  19. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction
    GitHub, Twitter :: @pivovarit

    View Slide

  20. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction
    GitHub, Twitter :: @pivovarit

    View Slide

  21. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction
    GitHub, Twitter :: @pivovarit

    View Slide

  22. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction
    GitHub, Twitter :: @pivovarit

    View Slide

  23. Function, BiFunction
    Consumer extends Function
    Supplier extends Function
    Predicate extends Function
    UnaryOperator extends Function
    BinaryOperator extends BiFunction
    GitHub, Twitter :: @pivovarit

    View Slide

  24. MONAD
    GitHub, Twitter :: @pivovarit

    View Slide

  25. GitHub, Twitter :: @pivovarit

    View Slide

  26. GOOGLE IMAGES...

    View Slide

  27. GOOGLE IMAGES...

    View Slide

  28. GOOGLE IMAGES...

    View Slide

  29. GOOGLE IMAGES...

    View Slide

  30. GOOGLE IMAGES...

    View Slide

  31. GOOGLE IMAGES...

    View Slide

  32. GOOGLE IMAGES...

    View Slide

  33. GOOGLE IMAGES...

    View Slide

  34. ...
    GitHub, Twitter :: @pivovarit

    View Slide

  35. MONAD
    Design pattern
    http://got-steam.com/
    GitHub, Twitter :: @pivovarit

    View Slide

  36. Why bother? :
    Boilerplate--
    Readability++
    Complexity--
    GitHub, Twitter :: @pivovarit

    View Slide

  37. Imperative approach
    GitHub, Twitter :: @pivovarit

    View Slide

  38. Declarative approach
    GitHub, Twitter :: @pivovarit

    View Slide

  39. Generic type:
    "unit" method:
    "bind" method:
    MONAD
    GitHub, Twitter :: @pivovarit

    View Slide

  40. Generic type:
    "unit" method:
    "bind" method:
    MONAD
    GitHub, Twitter :: @pivovarit

    View Slide

  41. Generic type:
    "unit" method:
    "bind" method:
    MONAD
    GitHub, Twitter :: @pivovarit

    View Slide

  42. Generic type:
    "unit" method:
    "bind" method:
    MONAD
    GitHub, Twitter :: @pivovarit

    View Slide

  43. GitHub, Twitter :: @pivovarit

    View Slide

  44. GitHub, Twitter :: @pivovarit

    View Slide

  45. GitHub, Twitter :: @pivovarit

    View Slide

  46. http://www.ivanaborovnjak.com/project/box-in-a-box/
    GitHub, Twitter :: @pivovarit

    View Slide

  47. Solution
    GitHub, Twitter :: @pivovarit

    View Slide

  48. Monads in Java 8
    Optional
    Stream
    CompletableFuture
    GitHub, Twitter :: @pivovarit

    View Slide

  49. Monads in Java 8
    Optional
    Stream
    CompletableFuture
    GitHub, Twitter :: @pivovarit

    View Slide

  50. Optional
    Encapsulation of operations
    on optional values
    GitHub, Twitter :: @pivovarit

    View Slide

  51. Optional
    Encapsulation of operations
    on optional values
    GitHub, Twitter :: @pivovarit

    View Slide

  52. Optional
    type:
    "unit":
    "bind":
    GitHub, Twitter :: @pivovarit

    View Slide

  53. Optional
    type: Optional
    "unit":
    "bind":
    GitHub, Twitter :: @pivovarit

    View Slide

  54. Optional
    type: Optional
    "unit": Optional.ofNullable(), Optional.of()
    "bind":
    GitHub, Twitter :: @pivovarit

    View Slide

  55. Optional
    type: Optional
    "unit": Optional.ofNullable(), Optional.of()
    "bind": Optional.flatMap(), Optional.map()
    GitHub, Twitter :: @pivovarit

    View Slide

  56. Filtering an Optional
    .filter(Predicate)
    GitHub, Twitter :: @pivovarit

    View Slide

  57. Unwrapping an Optional
    .get()
    .orElse(T default)
    .orElseGet(Supplier)
    .orElseThrow(Supplier)
    .ifPresent(Consumer)
    GitHub, Twitter :: @pivovarit

    View Slide

  58. GitHub, Twitter :: @pivovarit
    http://theworryfreelife.com/wp-content/uploads/2015/08/comfort-zone.jpg

    View Slide

  59. Java 7 style
    GitHub, Twitter :: @pivovarit

    View Slide

  60. Java 8 style
    GitHub, Twitter :: @pivovarit

    View Slide

  61. Java 7,5 style ;)
    GitHub, Twitter :: @pivovarit

    View Slide

  62. Java 7,5 style ;)
    GitHub, Twitter :: @pivovarit

    View Slide

  63. GitHub, Twitter :: @pivovarit

    View Slide

  64. GitHub, Twitter :: @pivovarit

    View Slide

  65. Stream
    Encapsulation of operations
    on multiple items
    GitHub, Twitter :: @pivovarit

    View Slide

  66. Stream
    type: Stream
    "unit": Stream.of(), Arrays.stream(), Collection.stream()
    "bind": Stream.flatMap()
    GitHub, Twitter :: @pivovarit

    View Slide

  67. Stream
    GitHub, Twitter :: @pivovarit

    View Slide

  68. Stream
    GitHub, Twitter :: @pivovarit

    View Slide

  69. Stream
    GitHub, Twitter :: @pivovarit

    View Slide

  70. Imperative vs. Declarative
    GitHub, Twitter :: @pivovarit

    View Slide

  71. Imperative vs. Declarative
    GitHub, Twitter :: @pivovarit

    View Slide

  72. Stream && Optional
    GitHub, Twitter :: @pivovarit

    View Slide

  73. Stream
    lazy-initialized
    nonreusable
    GitHub, Twitter :: @pivovarit

    View Slide

  74. intermediate operations
    .map()
    .flatMap()
    .filter()
    .peek()
    GitHub, Twitter :: @pivovarit

    View Slide

  75. intermediate operations
    .map()
    .flatMap()
    .filter()
    .peek()
    Stream not consumed:
    does not print anything
    GitHub, Twitter :: @pivovarit

    View Slide

  76. Consuming Stream
    .forEach(Consumer)
    .collect()
    .reduce(BinaryOperator)
    .allMatch(), anyMatch(), noneMatch()
    .findFirst(), findAny()
    .count()
    .toArray()
    GitHub, Twitter :: @pivovarit

    View Slide

  77. Stream.reduce()
    GitHub, Twitter :: @pivovarit

    View Slide

  78. Collectors
    .toList(), toMap(), toSet(), toCollection()
    .minBy(), maxBy()
    .joining()
    .partitioningBy()
    ...and many others
    GitHub, Twitter :: @pivovarit

    View Slide

  79. Collectors.toList()
    GitHub, Twitter :: @pivovarit

    View Slide

  80. Stream in APIs
    "any string".chars()
    Files.newDirectoryStream()
    Random.ints()
    ...
    GitHub, Twitter :: @pivovarit

    View Slide

  81. you want more?
    GitHub, Twitter :: @pivovarit

    View Slide

  82. github.com/
    TouK/ThrowingFunction
    http://www.javaslang.io/
    GitHub, Twitter :: @pivovarit

    View Slide

  83. Thank You!
    GitHub, Twitter :: @pivovarit

    View Slide

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