fun with java 8

76
Fun with Java 8 Victor Perepelitsky twitter: @victor_perepel email: [email protected] git-hub: https://github.com/victor-prp/java8samples/

Upload: victorperepelitsky

Post on 17-Jul-2015

119 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Fun with java 8

Fun with Java 8Victor Perepelitsky

twitter: @victor_perepelemail: [email protected]: https://github.com/victor-prp/java8samples/

Page 2: Fun with java 8

This presentation focuses on

What functional programming is ?

Why functional ?

How to use java 8 for functional ?

Page 3: Fun with java 8

Functional ProgrammingIn computer science, functional programming is a

programming paradigm, a style of building the structureand elements of computer programs, that treatscomputation as the evaluation of mathematical functionsand avoids changing state and mutable data. It is a declarativeprogramming paradigm, which means programming isdone with expressions.

Page 4: Fun with java 8

Functional Programming

Functions

Avoids mutable data

Declarative

Expressions

Page 5: Fun with java 8

Why Functional?Less code

Expressive code

Correct code

It is FUN

Performance*

Page 6: Fun with java 8

Functional building blocks in java 8Function

Function reference

Lambda

Predefined Java8 functions - java.util.function

Stream APIp2

Page 7: Fun with java 8

Basic Function Definition

p1*

Page 8: Fun with java 8

Basic Function Usage

p1

Page 9: Fun with java 8

Fun Reference - static fun

p1

Page 10: Fun with java 8

Fun Reference - static fun

p1

Page 11: Fun with java 8

Higher Order Function - Definition

p1*

Page 12: Fun with java 8

p1

Page 13: Fun with java 8

pureFun doItTwice

pureFun

pureFun

p1

Page 14: Fun with java 8

java.util.function Function<T, R> accepts T, returns R

BiFunction<T, U, R> accepts T and U, returns R

Consumer<T> accepts T, returns void

Supplier<T> accepts nothing, returns T

Predicate<T> accepts T, returns boolean

p1

Page 15: Fun with java 8

Lambda - simple example

p1

Page 16: Fun with java 8

Lambda - formal definitionAnonymous function (also function literal or lambda abstraction) is a function definition that is not bound to an identifier. Lambdas are often:1. passed as arguments to higher-order

functions, or2. used to construct the result of a higher-

order function that needs to return a function.

p1

Page 17: Fun with java 8

LambdaAnonymous function

Passed as argument (common usage)

In java 8 it is only syntactic sugar for function

reference

p1

Page 18: Fun with java 8

Lambda

p1

Page 19: Fun with java 8

MonadIn functional programming, a monad is a structure that

represents computations defined as sequences of

steps.

A type with a monad structure defines what it means to

chain operations, or nest functions of that type together

http://en.wikipedia.org/wiki/Monad_%

28functional_programming%29p3

Page 20: Fun with java 8

In Java 8 Stream is a Monad

Chaining stream operations forming a stream pipeline

p3

menu filter sorted map collect

how to filter how to sort how to map how to collect

List<String >

Page 21: Fun with java 8

Java 8 Stream● A stream represents a sequence of elements and supports

different kind of operations to perform computations upon those elements

● Stream operations are either intermediate or terminal.● Intermediate operations return a stream so we can chain

multiple intermediate operations.● Terminal operations are either void or return a non-stream

result.

p3

Page 22: Fun with java 8

Let’s see it again

p3

menu stream filter sorted map collect

how to filter how to sort how to map how to collect

List<String >

intermediate final

Page 23: Fun with java 8

Stream vs Collection● Like a collection, a stream provides an interface to a

sequenced set of values of a specific element type● Because collections are data structures, they’re

mostly about storing and accessing elements with specific time/space complexities

● Streams are about expressing computations such as filter, sorted, and map that

● Collections are about data; streams are about computations

p2

Page 24: Fun with java 8

Basic building blocks summaryFunction

Function reference

Lambda

Predefined Java8 functions - java.util.function

Stream APIp2

Page 25: Fun with java 8

Why Functional?Less code

Expressive code

Correct code

It is FUN

Performance*p2

Page 26: Fun with java 8

Imperative

p5

Page 27: Fun with java 8

Declarative

p5

Page 28: Fun with java 8

Referential transparencyAn expression is said to be referentially transparent if it can

be replaced with its value without changing the behavior

of a program (in other words, yielding a program that has

the same effects and output on the same input). The

opposite term is referential opaqueness.

http://en.wikipedia.org/wiki/Referential_transparency_

(computer_science)p2**

Page 29: Fun with java 8

Pure Function

1. Given same input, always provides same output

2. Execution does not cause observable side-

effects

1+2 = Referential Transparency

p2

Page 30: Fun with java 8

Why pure functions?

Allows automatic optimizations by a compiler

Minimizes moving parts

Easy to test

Increases decoupling

p2

Page 31: Fun with java 8

Pure functions - is it enough?

doIt1(..) and doIt2(..) - are pure functions?

but we wrote them in two different ways?!

p2

Page 32: Fun with java 8

Imperative

p5

Page 33: Fun with java 8

Declarative

p5

Page 34: Fun with java 8

Refactor toward functional

Let’s combine pure functions with declarative style

Example: Design a system that returns top UK and US music albums

p3

Page 35: Fun with java 8

p3*

Page 36: Fun with java 8

p3

Page 37: Fun with java 8

p3

Page 38: Fun with java 8

We want to search albums

By Name

and

By Year

p3*

Page 39: Fun with java 8

version 1

p3

Page 40: Fun with java 8

version 2 - pass behaviour

p3

Page 41: Fun with java 8

version 3 - compact naming

p3

Page 42: Fun with java 8

We want the data in specific form

Example: get years of hits albums

p3*

Page 43: Fun with java 8

version 1

p3

Page 44: Fun with java 8

version 2

p3

Page 45: Fun with java 8

We want the data reduced

Example: get the oldest album

p3

Page 46: Fun with java 8

version 1

p3

Page 47: Fun with java 8

version 2

p3

Page 48: Fun with java 8

So far we sawPure functions vs Non pure...

Declarative vs Imperative...

Functions as building blocks…

Passing behavior vs static behavior…

Function reference vs Lambda...

Page 49: Fun with java 8

Additional useful techniquesExecution guarantee

Builder pattern

Composition

Currying and Partial application

p4

Page 50: Fun with java 8

We want to

Guarantee correct locking byWrite it onceandLet it use in multiple places

p4*

Page 51: Fun with java 8

Execution guarantee

p4

Page 52: Fun with java 8

Builder patternStringBuilder is a good example:

p4

Page 53: Fun with java 8

How builder pattern helps?

We already saw it - streams

We can create our own builders to introduce fluent interfaces

p4

Page 54: Fun with java 8

Can we search by multiple filters?

p4

Page 55: Fun with java 8

We actually want this:

p4*

Page 56: Fun with java 8

How can we achieve this?

p4

Page 57: Fun with java 8

Composition

p4

Page 58: Fun with java 8

Partial Application

p4

Page 59: Fun with java 8

Search using match(...)

p4

Page 60: Fun with java 8

Search with Partial Application V1

p4

Page 61: Fun with java 8

Search with Partial Application V2

p4

Page 62: Fun with java 8

Why Functional?Less code

Expressive code

Correct code

It is FUN

Performance*

Page 63: Fun with java 8

Performance - is it better in java8?Depends:

● Pure functions may be memoized

● Stream API may be heavier

● There are more considerations….

p5

Page 64: Fun with java 8

Performance - example

We have doIt1 and doIt2 using both imperative

and declarative styles

p5

Page 65: Fun with java 8

Imperative

p5

Page 66: Fun with java 8

Declarative

p5

Page 67: Fun with java 8

Performance - example

Let’s run it 1000 times

Results:

● doIt1 took: 15ms

● doIt2 took: 63ms

p5

Page 68: Fun with java 8

Declarative - improved version

p5

Page 69: Fun with java 8

Performance - example

Let’s run it 1000 times

Results:

● doIt1 took: 15ms

● doIt2 took: 63ms

● doIt4 took: 30msp5

Page 70: Fun with java 8

Can Java 8 be used for functional programming?

Function reference

Composition

Lambda

Stream API

Currying and Partial Application*

Page 71: Fun with java 8

Any problems?

We have to define an interface for a function

Special treatment for functions with primitives

Partial application is not straightforward

Typed exceptions

Page 72: Fun with java 8

GuidelinesAim to declarativeAim to immutabilityAim to pure functionsConsider function ref over lambdaBe aware of performance when using streamUse multi paradigm programming

Page 73: Fun with java 8
Page 74: Fun with java 8
Page 75: Fun with java 8