Top Banner
FUNCTIONAL PRINCIPLES Introduction to Functional Programming and Java 8
111

Functional programming principles and Java 8

Jul 18, 2015

Download

Technology

Dragos Balan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Functional programming principles and Java 8

FUNCTIONAL

PRINCIPLES

Introduction to Functional Programming and Java 8

Page 2: Functional programming principles and Java 8

WHY ?

Page 3: Functional programming principles and Java 8

WHY FUNCTIONAL PROGRAMMING ? / MOORE’S LAW

Page 4: Functional programming principles and Java 8

WHY FUNCTIONAL PROGRAMMING ? / MULTI CORE TREND

Page 6: Functional programming principles and Java 8

WHAT ?

Page 7: Functional programming principles and Java 8

•A programming paradigm where functions are first-class entities

• The main concepts are:

1. programming with functions

2. avoid mutation

•A new way of thinking

WHAT IS FP ?

Page 8: Functional programming principles and Java 8

•Object Immutability

• Functions:

– as first class citizens

– no side effects (Pure functions)

– Higher Order Functions

•No loops

• Lazy evaluation

WHAT IS FP ? / FUNCTIONAL PRINCIPLES

Page 9: Functional programming principles and Java 8

• Easier parallelization

• Less code

• Easy testing

• Results instead of steps

• Easy to understand code

WHAT IS FP ? / WHAT YOU GET ?

Page 10: Functional programming principles and Java 8

HOW ?

Page 11: Functional programming principles and Java 8

IMMUTABILITY

Page 12: Functional programming principles and Java 8

An immutable object is an object whose state cannot be modified after it is created

IMMUTABLE OBJECTS

Page 13: Functional programming principles and Java 8

“Classes should be immutable unless there’s very good reason to make them mutable… If a class cannot be made immutable, limit its mutability as much as possible”

Joshua Bloch

IMMUTABLE OBJECTS

Page 14: Functional programming principles and Java 8

IMMUTABLE OBJECTS / JAVA

Page 15: Functional programming principles and Java 8

IMMUTABLE OBJECTS / DEFENSIVE COPY

Page 16: Functional programming principles and Java 8

IMMUTABLE OBJECTS / OTHER FUNCTIONAL LANGUAGES

Page 17: Functional programming principles and Java 8

IMMUTABLE OBJECTS / OTHER FUNCTIONAL LANGUAGES

Page 18: Functional programming principles and Java 8

IMMUTABLE OBJECTS / HOW TO CHANGE ?

Page 19: Functional programming principles and Java 8

IMMUTABLE OBJECTS / PARALLELISM

Page 20: Functional programming principles and Java 8

•are thread-safe

•are simple to construct

•easy to test

•easy to use

• favors caching

IMMUTABLE OBJECTS / PROS

Page 21: Functional programming principles and Java 8

• Large object graphs

• Memory consumption

• Extra garbage collection cycles needed

IMMUTABLE OBJECTS / CONS

Page 22: Functional programming principles and Java 8

FUNCTIONS

F : X → Y

Page 23: Functional programming principles and Java 8

HIGHER ORDER

FUNCTIONS

(HOF)

Page 24: Functional programming principles and Java 8

HOF = functions that can take other functions as arguments and / or return other functions as result

HIGHER ORDER FUNCTIONS / DEFINITION

Page 25: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / FIRST CLASS CITIZENS

Page 26: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / FUNCTIONS AS PARAMS

Page 27: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / RETURN FUNCTIONS

Page 28: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / HOFS EXAMPLE IN F#

Page 29: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / BENEFITS

Page 30: Functional programming principles and Java 8

•Allows easy parallelism

•Encourages abstraction

•Reusing of common code

• Isolates the essential parts

•Allows easier unit testing

HIGHER ORDER FUNCTIONS

Page 32: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / JAVA CLASSES

Page 33: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / USAGE OF JAVA 8 FUNC. CLS.

Page 34: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS

Page 35: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / LAMBDA EXPRESSIONS

• A lambda expression is an anonymous method

• Lambdas favor HOFs

• more powerful libraries

• more expressive, more readable, less

error-prone use code

• Boosts developer productivity

• key to an accessible parallelism strategy

Page 36: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / LAMBDA EXAMPLES 1

Page 37: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / LAMBDA EXAMPLES 2

Page 38: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / HOF IN JAVA 8

Page 40: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / FUNC. INTERFACE EXAMPLE

Page 41: Functional programming principles and Java 8

HIGHER ORDER FUNCTIONS / FUNCTION REFERENCES

Page 42: Functional programming principles and Java 8

CHECKPOINT

Page 43: Functional programming principles and Java 8

FUNCTIONS

(PURE

FUNCTIONS)

Page 44: Functional programming principles and Java 8

A function is said to be pure if

1. it returns same set of values for same set of inputs

2. It does not have any observable side effects

PURE FUNCTIONS / DEFINITION

Page 45: Functional programming principles and Java 8

PURE FUNCTIONS / EXAMPLE 1

Page 47: Functional programming principles and Java 8

Impure functions / Side effects :

1. Alter parameters passed by ref

2. Alter members of passed objects

3. Alter external objects

PURE FUNCTIONS / SIDE EFFECTS

Page 48: Functional programming principles and Java 8

PURE FUNCTIONS / EXAMPLE 2

Page 49: Functional programming principles and Java 8

• sin(x)

• length(a)

• random()

• println(String s)

• Insert values(x, y, z) into DB_TABLE

PURE FUNCTIONS / SAMPLE OF PURE AND IMPURE FNC

Page 50: Functional programming principles and Java 8

• easier to understand

• easy maintenance

• easy testing / unit-testing

• favor concurrency

PURE FUNCTIONS / PROS

Page 51: Functional programming principles and Java 8

PURE FUNCTIONS / BENEFITS

Page 52: Functional programming principles and Java 8

“No side effects” is utopic

PURE FUNCTIONS / CONS

Page 53: Functional programming principles and Java 8

FUNCTION

COMPOSITION

Page 57: Functional programming principles and Java 8

CHECKPOINT

Page 58: Functional programming principles and Java 8

NO LOOPS

Page 60: Functional programming principles and Java 8

NO LOOPS

(RECURSION)

Page 61: Functional programming principles and Java 8

RECURSION / EXAMPLE OF AN ITERATIVE FUNCTION

A recursive function is a function that calls itself during its execution

Page 63: Functional programming principles and Java 8

RECURSION / TAIL RECURSION

Tail recursion = a recursive function calls itself as its last action

Page 64: Functional programming principles and Java 8

NO LOOPS / RECURSION - TAIL RECURSION

Page 66: Functional programming principles and Java 8

NO LOOPS / RECURSION - RECURSION ENCOURAGED

Page 67: Functional programming principles and Java 8

NO LOOPS

(FUNCTION

CHAINING)

Page 68: Functional programming principles and Java 8

NO LOOPS / FUNCTION CHAINING

• Similar to unix pipes :

ps -ax | tee processes.txt | more

• Already used in java in fluent interfaces

• Eliminate the need for intermediate variables

Page 69: Functional programming principles and Java 8

NO LOOPS / FUNCTION CHAINING

persons.stream()

.filter(e -> e.getGender() == Person.Sex.MALE)

.forEach(e -> System.out.println(e.getName()));

for (Person p : persons) {

if (p.getGender() == Person.Sex.MALE) {

System.out.println(p.getName());

}

}

Page 70: Functional programming principles and Java 8

NO LOOPS / AGGREGATE OPERATIONS

• They use internal iteration

• They process elements from a stream

• They support behavior as parameters

Page 71: Functional programming principles and Java 8

NO LOOPS / FUNCTION CHAINING EXAMPLE

Page 72: Functional programming principles and Java 8

NO LOOPS / FUNCTION CHAINING

Page 73: Functional programming principles and Java 8

NO LOOPS / FUNCTION CHAINING

double average = persons.stream()

.filter(p -> p.getGender() == Person.Sex.MALE)

.mapToInt(Person::getAge)

.average()

.getAsDouble();

Page 76: Functional programming principles and Java 8

FUNCTIONS CHAINING / STREAMS IN JAVA 8

• Streams do not provide a means to directly access or manipulate their elements

• are concerned with declaratively describing the computational operations which will be performed in aggregate on that source

• No storage: they carry values from a source through a pipeline

• Functional in nature ( operations do not modify its underlying data)

• Operations can be implemented lazily ( for single pass execution & efficient implementation of short-circuit operations)

• No bounds : streams can be infinite

Page 77: Functional programming principles and Java 8

FUNCTION CHAINING / STREAMS, OPTIONAL, LAZINESS

Page 78: Functional programming principles and Java 8

FUNCTION CHAINING / SEQUENTIAL REDUCE

Page 79: Functional programming principles and Java 8

FUNCTION CHAINING / SEQUENTIAL REDUCE

Page 81: Functional programming principles and Java 8

FUNCTION CHAINING / PARALLEL REDUCE

Page 84: Functional programming principles and Java 8

OTHER

FUNCTIONAL

FEATURES

(OPTIONAL)

Shameless copy-paste from www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

Page 85: Functional programming principles and Java 8

OPTIONAL / WHY OPTIONAL ?

Page 86: Functional programming principles and Java 8

OPTIONAL / NULL, THE BILLION DOLLAR MISTAKE

"I call it my billion-dollar mistake. It was the invention of the null reference in 1965. […]

I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement.

This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years“

Tony Hoare

Page 87: Functional programming principles and Java 8

OPTIONAL / THE SOLUTION TO NULL

java.util.Optional<T> :

• A class that encapsulates an optional value

• A single-value container that either contains a value or doesn't (empty)

Page 88: Functional programming principles and Java 8

OPTIONAL / HOW TO CREATE IT

Page 89: Functional programming principles and Java 8

OPTIONAL / HOW TO USE IT

Page 90: Functional programming principles and Java 8

OPTIONAL / THE MOST IMPORTANT METHODS

Page 91: Functional programming principles and Java 8

OPTIONAL / RETURN TO ORIGINAL EXAMPLE

Page 92: Functional programming principles and Java 8

OPTIONAL / BENEFITS

• Idiot proof / Clear intent

• Cleaner code (no more null checks)

• Encourages method chaining

• End of NullPointerException

Page 93: Functional programming principles and Java 8

OPTIONAL / CONS

• Performance

• Serialization - Optional is not

• Certain operations involving parametric polymorphism become cumbersome

Page 94: Functional programming principles and Java 8

CHECKPOINT

Page 95: Functional programming principles and Java 8

FP CHANGES

EVERYTHING

Page 96: Functional programming principles and Java 8

EVERYTHING CHANGES / THREADS WITH LAMBDAS

Page 97: Functional programming principles and Java 8

EVERYTHING CHANGES / ACTION LISTENERS W/ LAMBDAS

Page 98: Functional programming principles and Java 8

EVERYTHING CHANGES / COMPARATORS

Page 99: Functional programming principles and Java 8

EVERYTHING CHANGES / LIST ITERATION, FILTERING, ETC.

Page 100: Functional programming principles and Java 8

EVERYTHING CHANGES / READING FILES

Page 101: Functional programming principles and Java 8

EVERYTHING CHANGES / SPRING

Page 102: Functional programming principles and Java 8

CHECKPOINT

Page 103: Functional programming principles and Java 8

• Immutability

• Higher Order Functions

• Pure functions

• No loops ( recursion, function chaining)

• Lazy evaluation

• Type inference

• Parallelism

• Easy coding / understanding

RECAP / FUNCTIONAL PROGRAMMING

Page 104: Functional programming principles and Java 8

• Introduced FP features

• Functional interfaces

• Function/Predicate/Producer/Consumer

• Default methods

• Lambda expressions

• Streams

• Map/Reduce/Filter/Collect

• Type inference

RECAP / JAVA 8

Page 105: Functional programming principles and Java 8

• Easier parallelization

• Less code

• Easy testing

• Results instead of steps

• Easy to understand code

WHAT IS FP ? / WHAT YOU GET ?

Page 106: Functional programming principles and Java 8

QUESTIONS

Page 107: Functional programming principles and Java 8

THE END

Page 108: Functional programming principles and Java 8

• Scheme, Lisp

• ML, OCaml

• Haskell

• Erlang

• Scala

• Clojure

• F#

WHAT’S NEXT ? / OTHER FUNCTIONAL LANGUAGES

Page 109: Functional programming principles and Java 8

•Retrolambda – backport of

java 8 lambdas in Java 7,6,5

• functionaljava.org

•Google Guava

WHAT’S NEXT ? / FP IN JAVA BEFORE JAVA8

Page 110: Functional programming principles and Java 8

•Reactive programming

WHAT’S NEXT ? / OTHER TECHNOLOGIES

Page 111: Functional programming principles and Java 8

WHAT’S/WHO’S

NEXT ?