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

Javaslang - functional Java done right

Javaslang - functional Java done right

Grzegorz Piwowarek

July 02, 2016
Tweet

More Decks by Grzegorz Piwowarek

Other Decks in Programming

Transcript

  1. 7

  2. Java 8 issues: No functional data structures No memoization, no

    lifting No pattern matching No Tuple Only 3 monadic containers Lack of Stream/Optional in APIs Checked exceptions in functions Type pollution list.stream().map(...).collect(toList()) ... 8
  3. List<String> foo(List<String> list) { if (this.state.isEmpty() || list.isEmpty()) { throw

    new IllegalStateException("Ouch..."); } list.add(this.state.get(0)); list.add(CONSTANT); this.moreState.addAll(list); OtherClass.mutableStaticField = list; return list; } 10
  4. Potential inputs: params instance state global state Potential outputs: returned

    value mutable instance state mutable global state mutable params exceptions 12
  5. "Functional programming is about writing pure functions, about removing hidden

    inputs and outputs as far as we can, so that as much of our code as possible just describes a relationship between inputs and outputs." http://blog.jenkster.com/2015/12/what-is-functional-programming.html 15
  6. final Date date = new Date(); final HashMap<Date, Object> map

    = new HashMap<>(); map.put(date, "some value"); date.setTime(123); map.containsKey(date); // false 17
  7. 18

  8. λ Function2<Integer, Integer, Integer> sum = (a, b) -> a

    + b; CheckedFunction2<Integer, Integer, Integer> sum = (a, b) -> a + b; composition lifting currying memoization 20
  9. Lifting Function2<Integer, Integer, Integer> divideBy = (a, b) -> a

    / b; Function2<Integer, Integer, Option<Integer>> lift = lift(divideBy); 21
  10. Currying Function2<Integer, Integer, Integer> sum = (a, b) -> a

    + b; Function1<Integer, Integer> add2 = add.curried().apply(2); 22
  11. Memoization Function2<Integer, Integer, Integer> sum = (a, b) -> a

    + b; Function2<Integer, Integer, Integer> memoizedSum = sum.memoized(); 23
  12. Tuple Tuple2<String, Integer> java8 = Tuple.of("Java", 8); Tuple2<String, Integer> that

    = java8.map( s -> s + "slang", i -> i / 4 ); String transform = java8.transform((s, i) -> s + i); Iterable<?> objects = java8.toSeq() 25
  13. List<Optional<Integer>> list = Arrays .asList(Optional.of(1), Optional.empty(), Optional.of(3)); list.stream() .filter(Optional::isPresent) .map(Optional::get)

    .collect(toList()); List<Integer> list = List.of(Option.of(1), Option.<Integer>none()); list.flatMap(o -> o); Java 8 Javaslang 29
  14. 37

  15. String on = Match(i).of( Case(x -> x % 2 ==

    0, "Even"), Case(x -> x % 2 == 1, "Odd"), Case($(), "?")); Option<String> on = Match(i).option( Case(x -> x % 2 == 0, "Even"), Case(x -> x % 2 == 1, "Odd")); 40
  16. Match(localDate).of( Case(LocalDate(2016, 2, 13), () -> "2016-02-13"), Case(LocalDate(2016, $(), $_),

    m -> "month " + m + " in 2016"), Case(LocalDate($(2016), $(), $_), (y, m) -> "my" + m + y), Case($_, () -> "(catch all)") ); 42
  17. Match(i).of( Case(is(1), "1"), Case(isIn(2, 3), "2 or 3"), Case(anyOf(is(4), noneOf(is(5),

    is(6))), "4 or not (5 or 6)"), Case(instanceOf(String.class), "String content"), Case($(), "?") ); http://koziolekweb.pl/2016/06/18/pattern-matching-w-javie-z-javaslang-ii/ 43