functional programming in java 8

128
FP in JAVA 8 sponsored by Ignasi Marimon-Clos (@ignasi35) JUG Barcelona

Upload: ignasi-marimon-clos

Post on 22-Apr-2015

249 views

Category:

Technology


4 download

DESCRIPTION

Java 8 supports lambdas. It's API also comes with Streams support. But Knowing some concepts on Functional Programming may help you get a lot more from what this new version of Java has to offer.

TRANSCRIPT

Page 1: Functional Programming in JAVA 8

FP in JAVA 8

sponsored by !Ignasi Marimon-Clos (@ignasi35)

JUG Barcelona

Page 2: Functional Programming in JAVA 8

@ignasi35

thanks!

Page 3: Functional Programming in JAVA 8

@ignasi35

about you

Page 4: Functional Programming in JAVA 8

@ignasi35

about me

@ignasi35

1) problem solver, Garbage Collector, mostly scala, java 8, agile for tech teams

2) kayaker

3) under construction

4) all things JVM

Page 5: Functional Programming in JAVA 8

@ignasi35

FP in Java 8

Pure Functions

no side effects

if not used, remove it

fixed in — fixed out

Page 6: Functional Programming in JAVA 8

@ignasi35

FP in Java 8

(T, R) -> Q

Page 7: Functional Programming in JAVA 8

@ignasi35

FP in Java 8

Supplier<T>

Function<T,R>

BiFunction<T,R,Q>

Predicate<T>

Consumer<T>

() -> T

(T) -> R

(T, R) -> Q

(T) -> boolean

(T) -> {}

Page 8: Functional Programming in JAVA 8

@ignasi35

currying

(T, R) -> (Q) -> (S) -> J

BiArgumentedPrototipicalFactoryFactoryBean

Page 9: Functional Programming in JAVA 8

@ignasi35

Page 10: Functional Programming in JAVA 8

@ignasi35

thanks!

Page 11: Functional Programming in JAVA 8

@ignasi35End of presentation

Page 12: Functional Programming in JAVA 8

@ignasi35

Page 13: Functional Programming in JAVA 8

@ignasi35

Page 14: Functional Programming in JAVA 8

@ignasi35

Page 15: Functional Programming in JAVA 8

@ignasi35

Page 16: Functional Programming in JAVA 8

@ignasi35

Page 17: Functional Programming in JAVA 8

@ignasi35

Page 18: Functional Programming in JAVA 8

@ignasi35

Page 19: Functional Programming in JAVA 8

@ignasi35

Page 20: Functional Programming in JAVA 8

@ignasi35

Page 21: Functional Programming in JAVA 8

@ignasi35

Page 22: Functional Programming in JAVA 8

@ignasi35

Page 23: Functional Programming in JAVA 8

@ignasi35

Page 24: Functional Programming in JAVA 8

@ignasi35

Page 25: Functional Programming in JAVA 8

@ignasi35

Page 26: Functional Programming in JAVA 8

@ignasi35

Page 27: Functional Programming in JAVA 8

@ignasi35

Page 28: Functional Programming in JAVA 8

@ignasi35

Page 29: Functional Programming in JAVA 8

@ignasi35

Page 30: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

Page 31: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Date is DEAD (my opinion) • Calendar is DEAD (my opinion)

!

!

• DEAD is 57005 (that’s a fact)

Page 32: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • LocalDate • LocalDateTime • Duration vs Period • ZonedDateTime

!

• Enum.Month • Enum.DayOfWeek

Page 33: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTimeEnum.Month !

• Not just JAN, FEB, MAR • Full arithmetic • plus(long months) • firstDayOfYear(boolean leapYear) • length(boolean leapYear) • …

Page 34: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • replace your sys.currentTimeMillis • allows testing • Instant/now

• LocalDate • LocalDateTime • Duration vs Period • ZonedDateTime

Page 35: Functional Programming in JAVA 8

@ignasi35

Page 36: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • LocalDate • a date • no TimeZone • birth date, end of war, man on moon,…

• LocalDateTime • Duration vs Period • ZonedDateTime

Page 37: Functional Programming in JAVA 8

@ignasi35

Page 38: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • LocalDate • LocalDateTime • an hour of the day • noon • 9am

• Duration vs Period • ZonedDateTime

Page 39: Functional Programming in JAVA 8

@ignasi35

Page 40: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • LocalDate • LocalDateTime • Duration vs Period • Duration: 365*24*60*60*1000 • Period: 1 year (not exactly 365 days) • Duration (Time) vs Period (Date)

• ZonedDateTime

Page 41: Functional Programming in JAVA 8

@ignasi35

Page 42: Functional Programming in JAVA 8

@ignasi35

XXIst Century DateTime

• Clock • LocalDate • LocalDateTime • Duration vs Period • ZonedDateTime (not an Instant!!) • Immutable • nanosecond detail • Normal, Gap, Overlap

Page 43: Functional Programming in JAVA 8

@ignasi35

Page 44: Functional Programming in JAVA 8

@ignasi35

Page 45: Functional Programming in JAVA 8

@ignasi35

Page 46: Functional Programming in JAVA 8

@ignasi35

Page 47: Functional Programming in JAVA 8

@ignasi35

Page 48: Functional Programming in JAVA 8

@ignasi35

Page 49: Functional Programming in JAVA 8

@ignasi35

Page 50: Functional Programming in JAVA 8

@ignasi35

Page 51: Functional Programming in JAVA 8

@ignasi35

Page 52: Functional Programming in JAVA 8

@ignasi35

Lists

a1 1 2 3Nil

List<Integer> nil = Lists.nil(); ! List<Integer> a3 = nil.prepend(3); List<Integer> a2 = a3.prepend(2); List<Integer> a1 = a2.prepend(1);

Page 53: Functional Programming in JAVA 8

@ignasi35

Lists

a1 1 2 3Nil

head(); tail();

Page 54: Functional Programming in JAVA 8

@ignasi35

public interface List<T> { T head(); List<T> tail(); boolean isEmpty(); void forEach(Consumer<? super T> f); default List<T> prepend(T t) { return new Cons<>(t, this); } }

Lists

Page 55: Functional Programming in JAVA 8

@ignasi35

Listsa1

1 2 3Nil

List<Integer> a0 = a1.prepend(0); List<Integer> b = a1.prepend(4);

0

a0

4

b Cons

Cons

Cons Cons Cons

Page 56: Functional Programming in JAVA 8

@ignasi35

class Cons<T> implements List<T> { private T head; private List<T> tail; Const(T head, List<T> tail) { this.head = head; this.tail = tail; } ! T head(){return this.head;} List<T> tail(){return this.tail;} boolean isEmpty(){return false;} ! void forEach(Consumer<? super T> f){ f.accept(head); tail.forEach(f); } }

Lists

Page 57: Functional Programming in JAVA 8

@ignasi35

class Nil<T> implements List<T> { ! T head() { throw new NoSuchElementException(); } List<T> tail() { throw new NoSuchElementException(); } boolean isEmpty() { return true; } void forEach(Consumer<? super T> f){ } !}

Lists

Page 58: Functional Programming in JAVA 8

@ignasi35

Listsa1

1 2 3Nil

0

a0

4

b Cons

Cons

Cons Cons Cons

Persistent Datastructures (not ephemeral, versioning) Immutable As efficient (consider amortised cost)

Page 59: Functional Programming in JAVA 8

@ignasi35

Page 60: Functional Programming in JAVA 8

@ignasi35

filterclass Nil<T> implements List<T> { //… List<T> filter(Predicate<? super T> p) { return this; } } !class Cons<T> implements List<T> { //… List<T> filter(Predicate<? super T> p) { if (p.test(head)) return new Const<>(head, tail.filter(p)); else return tail.filter(p); } }

Page 61: Functional Programming in JAVA 8

@ignasi35

map

Page 62: Functional Programming in JAVA 8

@ignasi35

map

f

Page 63: Functional Programming in JAVA 8

@ignasi35

mapclass Nil<T> implements List<T> { //… <R> List<R> map(Function<T, R> f) { return (List<R>) this; } } !class Cons<T> implements List<T> { //… <R> List<R> map(Function<T, R> f) { return new Const<>(f.apply(head), tail.map(f)); } }

Page 64: Functional Programming in JAVA 8

@ignasi35

Page 65: Functional Programming in JAVA 8

@ignasi35

fold

f

f

f

Page 66: Functional Programming in JAVA 8

@ignasi35

fold

class Nil<T> implements List<T> { <Z> Z reduce(Z z, BiFunction<Z, T, Z> f) { return z; } } !class Cons<T> implements List<T> { <Z> Z reduce(Z z, BiFunction<Z, T, Z> f) { return tail.reduce(f.apply(z,head), f); } }

Page 67: Functional Programming in JAVA 8

@ignasi35

fold

aka reduce

Page 68: Functional Programming in JAVA 8

@ignasi35

map revisited

f

Page 69: Functional Programming in JAVA 8

@ignasi35

f

map revisited

Page 70: Functional Programming in JAVA 8

@ignasi35

! @Test void testMapList() { List<List<String>> actual = Lists .of(“hello world”, “This is sparta”, “asdf asdf”) .map(s -> Lists.of(s.split(“ ”))); ! List<String> expected = Lists.of(“hello”, “world”, “This”, “is”, “sparta”, “asdf”, “asdf”); ! assertEquals(expected, actual); }

map revisited

Page 71: Functional Programming in JAVA 8

@ignasi35

Page 72: Functional Programming in JAVA 8

@ignasi35

Page 73: Functional Programming in JAVA 8

@ignasi35

Page 74: Functional Programming in JAVA 8

@ignasi35

map

f

Page 75: Functional Programming in JAVA 8

@ignasi35

flatMap

f

Page 76: Functional Programming in JAVA 8

@ignasi35

flatMap

!class Cons<T> implements List<T> { //… <R> List<R> map(Function<T, R> f) { return new Const<>(f.apply(head), tail.map(f)); } ! <R> List<R> flatMap(Function<T, List<R> f) { return f.apply(head).append(tail.flatMap(f)); } !}

Page 77: Functional Programming in JAVA 8

@ignasi35

Page 78: Functional Programming in JAVA 8

@ignasi35

recap

filter !

map !

fold !

flatMap

Page 79: Functional Programming in JAVA 8

@ignasi35

Page 80: Functional Programming in JAVA 8

@ignasi35

class MyFoo { ! //@param surname may be null Person someFunc(String name, String surname) { … } !}

Page 81: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completely

Page 82: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforever

Page 83: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforeverand ever

Page 84: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforeverand everand ever

Page 85: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforeverand everand everand ever

Page 86: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforeverand everand everand everand ever

Page 87: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

replaces null completelyforeverand everand everand everand everand ever

Page 88: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

!class MyFoo { Person someFunc(String name, Optional<String> surname) { … } ! … !}

Page 89: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

!class MyFoo { Optional<Person> someFunc(Name x, Optional<Surname> y) { … } ! … !}

Page 90: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

Some/Just/Algo !

!

None/Nothing/Nada

ADT

Page 91: Functional Programming in JAVA 8

@ignasi35

Page 92: Functional Programming in JAVA 8

@ignasi35

Maybe (aka Optional)

filter: applies predicate and Returns input or None map: converts content fold: returns Some(content) or Some(default) flatMap: see list

get: returns content or throws Exception getOrElse: returns content or defaultValue

Page 93: Functional Programming in JAVA 8

@ignasi35

recap

filter !

map !

fold !

flatMap

ADT !

Functor

Page 94: Functional Programming in JAVA 8

@ignasi35

Page 95: Functional Programming in JAVA 8

@ignasi35

Page 96: Functional Programming in JAVA 8

@ignasi35

Future (aka CompletableFuture)

Page 97: Functional Programming in JAVA 8

@ignasi35

Future (aka CF, aka CompletableFuture)

!

[FAIL] Does not use map, flatMap, filter. !

[PASS] CF implemented ADT !

[FAIL] Because Supplier, Consumer, Function, Bifuction, … CF’s API sucks.

Page 98: Functional Programming in JAVA 8

@ignasi35

Future

filter: creates new future applying Predicate map: converts content if success. New Future fold: n/a flatMap: see list

andThen: chains this Future’s content into a Consumer onSuccess/onFailure: callbacks recover: equivalent to map() but applied only on Fail

Page 99: Functional Programming in JAVA 8

@ignasi35

recap

filter !map !fold !flatMap !andThen

ADT !Functor

Page 100: Functional Programming in JAVA 8

@ignasi35

!

Maybe simulates nullable Future will eventually happen

!

Exceptions still fuck up your day

recap

Page 101: Functional Programming in JAVA 8

@ignasi35

Page 102: Functional Programming in JAVA 8

@ignasi35

Page 103: Functional Programming in JAVA 8

@ignasi35

Try

Simulates a computation that: !

succeeded or

threw exception

Page 104: Functional Programming in JAVA 8

@ignasi35

Page 105: Functional Programming in JAVA 8

@ignasi35

Page 106: Functional Programming in JAVA 8

@ignasi35

Page 107: Functional Programming in JAVA 8

@ignasi35

Page 108: Functional Programming in JAVA 8

@ignasi35

Page 109: Functional Programming in JAVA 8

@ignasi35

Page 110: Functional Programming in JAVA 8

@ignasi35

Try in action

Page 111: Functional Programming in JAVA 8

@ignasi35

Try in action

Page 112: Functional Programming in JAVA 8

@ignasi35

Page 113: Functional Programming in JAVA 8

@ignasi35

Try in action

Page 114: Functional Programming in JAVA 8

@ignasi35

Page 115: Functional Programming in JAVA 8

@ignasi35

!class PersonRepository { Try<Person> loadBy(Name x, Optional<Surname> y) { … } ! … !}

Conclusions

Page 116: Functional Programming in JAVA 8

@ignasi35

class SafeDatabase { <T> T withTransaction(Function<Connection, T> block) { … } } !class AnyAOP { <T> T envolve(Supplier<T> block) { … } }

Conclusions

Page 117: Functional Programming in JAVA 8

@ignasi35

Page 118: Functional Programming in JAVA 8

@ignasi35

Page 119: Functional Programming in JAVA 8

@ignasi35

Moar resources

https://github.com/rocketscience-projects/javaslang

by https://twitter.com/danieldietrich

!

https://github.com/functionaljava/functionaljava

by http://www.functionaljava.org/ (runs in Java7)

thanks @thomasdarimont for the tip

Page 120: Functional Programming in JAVA 8

@ignasi35

Page 121: Functional Programming in JAVA 8

@ignasi35

Page 122: Functional Programming in JAVA 8

@ignasi35

Page 123: Functional Programming in JAVA 8

@ignasi35

Page 124: Functional Programming in JAVA 8

@ignasi35

Page 125: Functional Programming in JAVA 8

@ignasi35

Page 126: Functional Programming in JAVA 8

@ignasi35

Namaste

Page 127: Functional Programming in JAVA 8

@ignasi35

Questions

Page 128: Functional Programming in JAVA 8

@ignasi35End of presentation