functional programming in java - code for maintainability
TRANSCRIPT
![Page 1: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/1.jpg)
Functional Programming in Java
Code For Maintainability
1
KrkDataLink
Kraków
2017-02-15
@marcinstepien
www.smart.biz.pl
![Page 2: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/2.jpg)
Marcin Stepien
Developer, Consultant
@marcinstepien
www.smart.biz.pl
2005
www.whenvi.com
2014
2
![Page 3: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/3.jpg)
What is here
3
Code for maintainability
Functional Programing intro
Object vs Functional
Code examples
![Page 6: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/6.jpg)
Closure Lisp
Frege kind of Haskell
Scala
Java 8, Kotlin, Groovy
Functional Programming on JVM
6
![Page 8: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/8.jpg)
➔ Streams
➔ Lambda expressions
➔ Functions as first class citizens
➔ Functional Interfaces
8
Java 8 FP
![Page 9: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/9.jpg)
➔ 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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/10.jpg)
Function<Integer,Integer> increase = x -> x + 1;
#parameter -> body
10
Java 8 function
![Page 11: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/12.jpg)
#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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/17.jpg)
17
Lazy evaluation, infinite series
Stream<Integer> infiniteSeries = Stream.iterate(1, e -> e + 1)
![Page 18: Functional Programming in Java - Code for Maintainability](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/19.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022030313/58ed3f4d1a28ab2c708b462d/html5/thumbnails/20.jpg)
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