21
Functional Programming in Java Code For Maintainability 1 KrkDataLink Kraków 2017-02-15 @marcinstepien www.smart.biz.pl

Functional Programming in Java - Code for Maintainability

Embed Size (px)

Citation preview

Page 1: Functional Programming in Java - Code for Maintainability

Functional Programming in Java

Code For Maintainability

1

KrkDataLink

Kraków

2017-02-15

@marcinstepien

www.smart.biz.pl

Page 3: Functional Programming in Java - Code for Maintainability

What is here

3

Code for maintainability

Functional Programing intro

Object vs Functional

Code examples

Page 4: Functional Programming in Java - Code for Maintainability

So the next developer doesn’t hate you

Code For Maintainability

4

Page 5: Functional Programming in Java - Code for Maintainability

Maintainable Code

5

Reusable Expressive

Clear > Clever Separate of concerns

Page 6: Functional Programming in Java - Code for Maintainability

Closure Lisp

Frege kind of Haskell

Scala

Java 8, Kotlin, Groovy

Functional Programming on JVM

6

Page 7: Functional Programming in Java - Code for Maintainability

FunctionalProgramming

Java

7

Page 8: Functional Programming in Java - Code for Maintainability

➔ Streams

➔ Lambda expressions

➔ Functions as first class citizens

➔ Functional Interfaces

8

Java 8 FP

Page 9: Functional Programming in Java - Code for Maintainability

➔ No side effects

➔ Final variables

➔ y = f(x) always same y for given x

9

(pure) function

Page 10: Functional Programming in Java - Code for Maintainability

Function<Integer,Integer> increase = x -> x + 1;

#parameter -> body

10

Java 8 function

Page 11: Functional Programming in Java - Code for Maintainability

11

Functional interface Function descriptor

Predicate<T> T -> boolean

Consumer<T> T -> void

Function<T,R> T -> R

Supplier<T> () -> T

UnaryOperator<T> T -> T

BinaryOperator<T> (T,T) -> T

BiPredicate<L,R> (L,R) -> boolean

BiConsumer<T,U> (T,U) -> void

BiFunction<T,U,R> (T,U) -> R

Page 12: Functional Programming in Java - Code for Maintainability

#instead ofRunnable task =new Runnable() {

public void run() {System.out.println(”no arg consumer” )

}}

12

Replace ceremony with Lambda

Runnable task = () -> { System.out.println(”no arg consumer” ); };

Page 13: Functional Programming in Java - Code for Maintainability

13

Internal iterators

#instead of loopsfor(String name : names) {

System.out.println(name)}

#use internal iteratorsnames.forEach(e -> System.out.println(e))

#with method referencenames.forEach(System.out::println)

Page 14: Functional Programming in Java - Code for Maintainability

public int getSumOfEvens(List<Integer> nums){Integer sum = 0;for(Integer num : nums) {

if(num != null && num % 2 == 0) {sum += num;

}}return sum;

}

14

Fight verbosity with streamsnums.stream()

.filter(Objects::nonNull) .filter( number -> number % 2 == 0) .reduce(0, Integer::sum);

Page 15: Functional Programming in Java - Code for Maintainability

15

Passing functionspublic int getSum(List<Integer>nums,Predicate<Integer> filter,Bifunction<Integer,Integer,Integer> accumulator){

return nums.stream() .filter(filter)

.filter(Objects::nonNull) .reduce(0, accumulator);

}

Predicate<Integer> isEven = n -> n % 2 == 0;

int sum = getSum(numbers, isEven, Integer::sum);

Page 16: Functional Programming in Java - Code for Maintainability

16

Map reduce, lazy evaluation

public int getTranactions(List<User> users) { return users.stream() # or parallelStream() .filter(u -> u.isActivated()) .map( u -> u.getTranTotal()) .reduce(0, Integer::sum);} #terminal op

public Stream<Integer> get(List<User> users) { #no computation is happening here return users.stream() .filter(u -> u.isActivated()) .map( u -> u.getTranTotal());}

Page 17: Functional Programming in Java - Code for Maintainability

17

Lazy evaluation, infinite series

Stream<Integer> infiniteSeries = Stream.iterate(1, e -> e + 1)

Page 18: Functional Programming in Java - Code for Maintainability

18

Slimmer patterns: decorator

← https://en.wikipedia.org/wiki/Decorator_pattern#Second_example_.28coffee_making_scenario.29

← Hierarchy of types

can be replaced with Function Composition:● .compose(Function f) ● .andThan(Function f)

Page 19: Functional Programming in Java - Code for Maintainability

19

Function composition

class Barista {public static Coffee makeCoffee(Coffee baseCoffee, Function<Coffee, Coffee>... addIngredients) { return Stream.of(addIngredients) .reduce( Function.<Coffee>identity(), //or Function::andThan (addIngr1, addIngr2) -> addIngr1.andThan(addIngr2))

Coffee coffee = Barista.makeCoffee( new Arabica(), Coffee::withMilk, Coffee::withSprinkles));

Page 20: Functional Programming in Java - Code for Maintainability

Object vs Functional

20

● Imperative

● Mutability

● Lower abstraction

● Reveals impl. details

● Eager by default

● nulls

● Hierarchy of types

● Declarative

● Favors Immutability

● Expressive

● Hides impl. details

● Lazy by default

● Optionals

● Function composition