28
FP, simplified for java programmers Naveen Muguda

Functional Programming, simplified

Embed Size (px)

Citation preview

Page 1: Functional Programming, simplified

FP, simplified for java programmers

Naveen Muguda

Page 2: Functional Programming, simplified
Page 3: Functional Programming, simplified
Page 4: Functional Programming, simplified

Programming Paradigms

• Wikipedia lists about 30+ paradigms

Page 5: Functional Programming, simplified

Programming Paradigms(..continued)

• Two paradigms are largely prevalent • Procedural (vast majority)

• Object Oriented (occasional)

• Functional (old kid making a come back)

Page 6: Functional Programming, simplified

Procedural

OO

Functional

Structures

procedures

functions

types

objects

Page 7: Functional Programming, simplified

Paradigm:Data

Shared/Hidden Mutable/Immutable

Procedural Shared Mutable

Object Oriented Hidden Mutable

Functional Shared Immutable

Page 8: Functional Programming, simplified

Paradigm: snippets

• Find elements of a list

Procedural find(list)

Object Oriented list.find(y)

Functional list.filter(x -> (x == y));

Page 9: Functional Programming, simplified
Page 10: Functional Programming, simplified

Snippets(..continued)

even list.filter(x -> (x % 2) == 0)

odd list.filter(x -> (x % 2) != 0)

prime list.filter(Primes::isPrime)

Multiple of list.filter(x -> isMultiple(x, 4))

Page 11: Functional Programming, simplified
Page 12: Functional Programming, simplified

Building block: Function

• Functions return value vs stack.push()

• Functions are methods which have no side effects vs list.add()

• Functions always return the same value for the same input vs stack.pop()

• Functions don’t access data in other contexts* vs list.size()

Page 13: Functional Programming, simplified

Side effects

• Have to be managed

• push():pop()

• lock():unlock()

• allocate():free()

Page 14: Functional Programming, simplified

Control abstractions

Have side effects Don’t have side effects

statement Expression

procedure function

Page 15: Functional Programming, simplified

Higher order functions

• x, f, f(x)

• filter(Predicate predicate)• …

• if(predicate.test(x) == true)• result.add(x)

Page 16: Functional Programming, simplified

Granularity

• filter(Predicate<X> predicate)

• map(Function<X, Y> mapper)

• fold(T zero, Bifunction<T, T>combiner)

Page 17: Functional Programming, simplified

parameterization

• fold(1, (x, y) -> (x * y))

• fold(0, (x, y) -> (x + y))

• fold(Integer.Minimum, (x, y)-> max(x, y))

Page 18: Functional Programming, simplified

composability

• f(g(h(x)))

• map(h).map(g).map(f)

• filter(m).find(f).map(g).orElse(y)

Page 19: Functional Programming, simplified

..benefits

• Functions are easier to reason

• Functions are modular

• Functions are safer

Page 20: Functional Programming, simplified
Page 21: Functional Programming, simplified

Monad

• wrap data

• accept a chain of functions

• create a chain of monads

• Provide utility around wrapped data

Page 22: Functional Programming, simplified

Monad(..continued)

• wrap

• map

• flatMap

Page 23: Functional Programming, simplified

Monads

Monad Value

Identity storage

Stream parallelising pipeline

Promise deferring pipeline execution

Optional creates non-null and null pipelines,provides null safety

Either creates two pipelines, usually happy path and other path, encapsulates concerns

Try Creates two pipelines, happy path and exception path, encapsulates concerns

Page 24: Functional Programming, simplified
Page 25: Functional Programming, simplified

Modularization in non-FP worldModularization in FP world

Page 26: Functional Programming, simplified

Where is FP being used?

• map/reduce

• Java Streams

• Reactive

• Spark

• Kafka

Page 27: Functional Programming, simplified

recommendations

• statements -> expressions

• procedures-> functions

• null check -> Optional

• if-else-> Either

• if-else-> ternary

• for-> stream

• try-catch-> Try

Page 28: Functional Programming, simplified

catch

• Sorting, inserting are all painful

• great for queries, figuring out for mutations