Functional java 8

75
Functional Java 8 This Ain’t Your Daddy’s JDK Nick Maiorano ThoughtFlow Solutions Inc. 1

description

A discussion of the new Java 8 features and how Java has become a functionalized programming language.

Transcript of Functional java 8

  • 1. Functional Java 8 This Aint Your Daddys JDKNick Maiorano 1 ThoughtFlow Solutions Inc.

2. About me DeveloperSoftware ArchitectIndependent Consultant ThoughtFlow SolutionsFunctional Java 8 This Aint Your Daddys JDK2 3. Available April 2014Functional Java 8 This Aint Your Daddys JDK3 4. Functional Java 8 This Aint Your Daddys JDK4 5. Whats in Java 8? Encoding enhancementsEncryption updatesFunctional librariesConcurrency ModularizationRepeating annotationsNew Date/Time APIConcurrency updatesJava 8 Lambdas Nashorn JavaScript EngineChurch Performance improvementsFunctional Java 8 This Aint Your Daddys JDKGC updatesCollections5 6. Whats in Java 8? Functional librariesConcurrencyJava 8 LambdasChurchFunctional Java 8 This Aint Your Daddys JDKCollections6 7. The rocky road to lambdas Lambdas too difficult in late 1990s BGGA project initiated in 2007 JSR 335 filed in late 2009 Had to fit type system Maintain backward compatibility Java community dividedFunctional Java 8 This Aint Your Daddys JDK7 8. The rocky road to lambdas To be released as part of Java 7 To be released in September 2013 To be released in March 2014 Completing 7 years of workFunctional Java 8 This Aint Your Daddys JDK8 9. Functional Programming Rooted in lambda calculus Hastened by death of Moores law Programming paradigm of the timesFunctional Java 8 This Aint Your Daddys JDK9 10. Java DNA StructuredReflectiveObject OrientedImperativeConcurrent GenericGeneric 11. Java DNA StructuredReflectiveObject OrientedFunctionalImperativeConcurrent GenericGeneric 12. Organization JavaClasses Vs.FPFunctional Java 8 This Aint Your Daddys JDKFunctions12 13. Building blocks JavaPolymorphism, encapsulation, inheritance, dynamic binding Vs.FPFunctional Java 8 This Aint Your Daddys JDKHigher-order functions, currying, monads, list comprehensions13 14. Algorithmic style JavaImperative: define behaviour as a series of steps Vs.FPFunctional Java 8 This Aint Your Daddys JDKDeclarative: binding functions together without necessarily specifying their contents14 15. State management JavaPut state and behaviour together Vs.FPFunctional Java 8 This Aint Your Daddys JDKAvoid state15 16. Mutability JavaSupports mutability & immutability Vs.FPFunctional Java 8 This Aint Your Daddys JDKEmphasis on immutability16 17. Design patterns JavaRelies on design patterns to complement OOP for a higher level of abstraction Vs.FPFunctional Java 8 This Aint Your Daddys JDKIs already a higher level abstraction17 18. Concurrency JavaUse multi-threading, control access to shared resources via locks Vs.FPFunctional Java 8 This Aint Your Daddys JDKOrganize processing into parallel workflows each dedicated to a core and avoid state, shared resources and locks18 19. Recursion JavaSupported with limitations Vs.FPFunctional Java 8 This Aint Your Daddys JDKRudimentary19 20. Expressiveness JavaClear & verbose Vs.FPFunctional Java 8 This Aint Your Daddys JDKConcise & dense20 21. Functional Java Is a blend of imperative and object oriented programming enhanced with functional flavorsFunctional Java 8 This Aint Your Daddys JDK21 22. Functional Java 8 This Aint Your Daddys JDK22 23. New Syntax Lambdas Functional interfaces Method references Default methodsFunctional Java 8 This Aint Your Daddys JDK23 24. Whats a lambda?Functional Java 8 This Aint Your Daddys JDK24 25. Anatomy of the lambda Behavior-as-data facilitators On-the-fly code definers Ground-floor of FPFunctional Java 8 This Aint Your Daddys JDK25 26. Anatomy of the lambda Lambda blocks (Parameter declaration) -> {Lambda body}(Integer i) -> {System.out.println(i);};Functional Java 8 This Aint Your Daddys JDK26 27. Anatomy of the lambda Lambda blocks (Parameter declaration) -> {Lambda body}(Integer i) -> {System.out.println(i);};Functional Java 8 This Aint Your Daddys JDK27 28. Anatomy of the lambda Lambda expressions Parameter name -> Lambda expression(Integer i) -> {System.out.println(i);};Functional Java 8 This Aint Your Daddys JDK28 29. Anatomy of the lambda Lambda expressions Parameter name -> Lambda expressioni -> System.out.println(i);Functional Java 8 This Aint Your Daddys JDK29 30. Anatomy of the lambda Lambda expressions Parameter name -> single statement;i -> i * 2;Functional Java 8 This Aint Your Daddys JDKNo return statement30 31. Functional Interfaces Lambdas are backed by interfaces Single abstract methods @FunctionalInterfaceFunctional Java 8 This Aint Your Daddys JDK31 32. Functional Interfaces @FunctionalInterface public interface Calculator { int calculate(int x, int y); }Functional Java 8 This Aint Your Daddys JDK32 33. Functional Interfaces Calculator multiply = (x, y) -> x * y; Calculator divide = (x, y) -> x / y;int product = multiply.calculate(10, 20); int quotient = divide.calculate(10, 20); someMethod(multiply, divide); anotherMethod((x, y) -> x ^ y); Functional Java 8 This Aint Your Daddys JDK33 34. Functional Interfaces Over 40 functional interfaces in JDK 8 Rarely need to define your own Generic and specializedFunctional Java 8 This Aint Your Daddys JDK34 35. Functional Interfaces ConsumerSupplier T get()SupplierFunctional InterfacesConsumer void accept(T t);FunctionFunction R apply(T t);PredicatePredicate boolean test(T t);Functional Java 8 This Aint Your Daddys JDK35 36. Method References Calculator maxFinder = (x, y) -> Math.max(x, y);Functional Java 8 This Aint Your Daddys JDK36 37. Method References Calculator maxFinder = Math::max; Math Calculatorint max(int a, int b); int calculate(int x, int y);Functional Java 8 This Aint Your Daddys JDK37 38. Method References TypeTemplateStaticClass::methodInstanceinstanceVariable::methodConstructorClass::newSupersuper::methodGeneric constructorClass::newArrayClass[]::newFunctional Java 8 This Aint Your Daddys JDK38 39. Anonymous classes? Do we still need anonymous classes? Lambdas are behavior-only no state Only single abstract methodsFunctional Java 8 This Aint Your Daddys JDK39 40. Default Methods @FunctionalInterface public interface Calculator { int calculate(int x, int y); default int multiply(int x, int y) { return x * y; } } Functional Java 8 This Aint Your Daddys JDK40 41. Default Methods Can be overloaded Can be static or instance based Introduce multiple inheritanceFunctional Java 8 This Aint Your Daddys JDK41 42. Functional Java 8 This Aint Your Daddys JDK42 43. Java-style functional programming Other languages support FP natively Java supports FP through librariesFunctional interfacesFunctionalJava StreamsCollectionsFunctional Java 8 This Aint Your Daddys JDK43 44. Functionalized CollectionsFunctional Java 8 This Aint Your Daddys JDK44 45. Functionalized Lists List stooges = Arrays.asList("Larry", "Moe", "Curly");stooges.forEach(s -> System.out.println(s);Functional Java 8 This Aint Your Daddys JDK45 46. Functionalized Lists List stooges = Arrays.asList("Larry", "Moe", "Curly");stooges.forEach(System.out::println);Functional Java 8 This Aint Your Daddys JDK46 47. Functionalized Lists Function feminize = s -> "Larry".equals(s) ? "Lara" : "Moe".equals(s) ? "Maude" : "Shirley"; stooges.replaceAll(feminize);Functional Java 8 This Aint Your Daddys JDK47 48. Functionalized Lists Predicate moeRemover = s -> Moe".equals(s);stooges.removeIf(moeRemover);Functional Java 8 This Aint Your Daddys JDK48 49. Functionalized Maps Map> movieDb = new HashMap(); movieDb.computeIfAbsent(1930, k -> new LinkedList()); movieDb.compute(1930, (k, v) -> { v.add(Soup to nuts); return v;});Functional Java 8 This Aint Your Daddys JDK49 50. Functionalized Maps movieDb.putIfAbsent (1930, new LinkedList());movieDb.getOrDefault (1930, new LinkedList());Functional Java 8 This Aint Your Daddys JDK50 51. StreamsFunctional Java 8 This Aint Your Daddys JDK51 52. Streams LambdaStreamOperation 1Functional Java 8 This Aint Your Daddys JDKLambdaOperation 2LambdaOperation 3LambdaOperation 452 53. Streams BuildPeekFilterStream operations IterateMapReduceFunctional Java 8 This Aint Your Daddys JDK53 54. Streams private static boolean isPerfect(long n) { long sum = 0; for (long i = 1; i 0 && LongStream.rangeClosed(1, n / 2). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; }Functional Java 8 This Aint Your Daddys JDK55 56. Streams Declarative constructs Can abstract any imperative for/while loop Work best when adhering to FP principles Easily parallelizableFunctional Java 8 This Aint Your Daddys JDK56 57. Parallel Streams private static boolean isPerfect(long n) { return n > 0 && LongStream.rangeClosed(1, n / 2). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; }Functional Java 8 This Aint Your Daddys JDK57 58. Parallel Streams private static boolean isPerfect(long n) { return n > 0 && LongStream.rangeClosed(1, n / 2). parallel(). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; }Functional Java 8 This Aint Your Daddys JDK58 59. Parallel StreamsFunctional Java 8 This Aint Your Daddys JDK59 60. Parallel StreamsFunctional Java 8 This Aint Your Daddys JDK60 61. Parallel Streams Uses fork-join used under the hood Thread pool sized to # cores Order can be changedFunctional Java 8 This Aint Your Daddys JDK61 62. Parallel Streams private static boolean isPerfect(long n) { return n > 0 && LongStream.rangeClosed(1, n / 2). parallel(). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; }Functional Java 8 This Aint Your Daddys JDK62 63. Parallel Streams private static boolean isPerfect(long n) { return n > 0 && LongStream.rangeClosed(1, n / 2). parallel(). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; } List perfectNumbers = LongStream.rangeClosed(1, 8192). filter(PerfectNumberFinder::isPerfect). collect(ArrayList::new, ArrayList::add, ArrayList::addAll);Functional Java 8 This Aint Your Daddys JDK63 64. Parallel Streams private static boolean isPerfect(long n) { return n > 0 && LongStream.rangeClosed(1, n / 2). parallel(). filter(i -> n % i == 0). reduce(0, (l, r) -> l + r) == n; } List perfectNumbers = LongStream.rangeClosed(1, 8192).parallel(). filter(PerfectNumberFinder::isPerfect). collect(ArrayList::new, ArrayList::add, ArrayList::addAll);Functional Java 8 This Aint Your Daddys JDK64 65. Parallel Streams 8,128 33,550,336 8,589,869,056 137,438,691,328Functional Java 8 This Aint Your Daddys JDKImperative 0 190 48648 778853Serial Stream1 229 59646 998776Parallel Stream0 66 13383 20365165 66. Parallelization Must avoid side-effects and mutating state Problems must fit the associativity property Ex: ((a * b) * c) = (a * (b * c)) Must be enough parallelizable code Performance not always better Cant modify local variables (unlike for loops)Functional Java 8 This Aint Your Daddys JDK66 67. Streams (the good) Allow abstraction of details Communicate intent clearly Concise On-demand parallelizationFunctional Java 8 This Aint Your Daddys JDK67 68. Streams (the bad) Loss of flexibility and control Increased code density Can be less efficient On-demand parallelizationFunctional Java 8 This Aint Your Daddys JDK68 69. Functional Java 8 This Aint Your Daddys JDK69 70. Final thoughts on Java 8Functional Java 8 This Aint Your Daddys JDK70 71. How good is functional Java? Java now supports functional constructs But still OO at its core Functional expressions a little clunky Generics require more mental agility Conciseness is compromised Recursion not industrial strengthFunctional Java 8 This Aint Your Daddys JDK71 72. How good is functional Java? FP integrated cohesively & coherently New tools available for the massesFunctional Java 8 This Aint Your Daddys JDK72 73. Available at Amazon April 2014Functional Java 8 This Aint Your Daddys JDK73 74. @ThoughtFlow_IncFunctional Java 8 This Aint Your Daddys JDK74 75. QuestionsFunctional Java 8 This Aint Your Daddys JDK75