JavaZone 2014 - Iteration 2.0: Stream

23
Martin Skarsaune Java Developer and Co-Owner Iteration 2.0 Stream

description

Slide pack for my JavaZone talk Iteration 2.0: Stream. Official page: http://2014.javazone.no/presentation.html?id=640bf7b0

Transcript of JavaZone 2014 - Iteration 2.0: Stream

Page 1: JavaZone 2014 - Iteration 2.0: Stream

Martin SkarsauneJava Developer and Co-Owner

Iteration 2.0

Stream

Page 2: JavaZone 2014 - Iteration 2.0: Stream

Iteration Problem

Root

x

y z

u

v

public class Node { private Object data; private Map<String, Node> children;}

Page 3: JavaZone 2014 - Iteration 2.0: Stream

Recursion

• Need to traverse model

• recursiveY()• recursiveZ()• ...

void recursiveX() { x(); for (final Node child : children.values()) child.recursiveX(); }

Page 4: JavaZone 2014 - Iteration 2.0: Stream

External Iteration : Iterator

• Any way to implement recursion once and for all ?

• Iterator pattern (Java >= 1.2 )• Wikipedia:

” the iterator pattern is a design pattern in which an iterator is used to traverse a container and access the container's elements”

Page 5: JavaZone 2014 - Iteration 2.0: Stream

Client In Control

Iterator Behaviour

Root

x

y z

u

v

ClientIterator()

Iterator

next()

Page 6: JavaZone 2014 - Iteration 2.0: Stream

Iterator Issues

• The iterator instance has state– Strong references to provider and internal

state

• implementation often difficult• Thread unsafe by design

Page 7: JavaZone 2014 - Iteration 2.0: Stream

Internal Iteration - Visitor

• The visitor pattern• Wikipedia:

” the visitor design pattern is a way of separating an algorithm from an object structure on which it operates”

Page 8: JavaZone 2014 - Iteration 2.0: Stream

Provider in Control

Visitor Behaviour

Root

x

y z

u

v

Client

Visitor

visitor()visit(Node)

visit(Node)

visit(Node)

accept(Visitor)

Page 9: JavaZone 2014 - Iteration 2.0: Stream

Visitor Implementation

interface Visitor { void visit(Node node); }

void recursiveX() { x(); for (final Node child : children.values()) child.recursiveX(); }

Page 10: JavaZone 2014 - Iteration 2.0: Stream

Visitor Implementation

interface Visitor { void visit(Node node); }

void accept(Visitor visitor) { visitor.visit(this); for (final Node child : children.values()) child.accept(visitor); }

Page 11: JavaZone 2014 - Iteration 2.0: Stream

Visitor Usage

node.accept(n -> n.x());

node.accept(n -> n.y());

node.accept(n -> n.z());

Page 12: JavaZone 2014 - Iteration 2.0: Stream

Visitor – Limitations (Lambda)• Limited access to local scope– Final and effectively final variables

• Early exit not possible– break– return

Page 13: JavaZone 2014 - Iteration 2.0: Stream

Internal iteration in Java 8 - Stream• java.util.Stream• Not limited to collections• Many powerful methods• Potential gains

– Lazy evaluation– Parallell execution

• The default implementation (StreamSupport) is based on (spl)iterators

Page 14: JavaZone 2014 - Iteration 2.0: Stream

Stream In Control

(Spl)Iterator

StreamSupport

Default Stream Implementation

Root

x

y z

u

v

Clientstream()

next()

callback()

COMPLEXITY

LIMITATIONS

Page 15: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementationinterface Visitor { void visit(Node node); }

Page 16: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementation - GEneralizaion

interface Visitor<T> { void visit(T node); }

interface Visitable<T> { void accept(Visitor<T> visitor); }

Page 17: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementation - Concreteclass Node { void accept(Visitor visitor){ ... visitor.accept(this); ... } }

Page 18: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementation - Concrete

class Node { void accept(Visitor<Node> visitor){ ... visitor.accept(this); ... } }

Page 19: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementation - Concreteclass Node implements Visitable<Node> { void accept(Visitor<Node> visitor){ ... visitor.accept(this); ... } }

Page 20: JavaZone 2014 - Iteration 2.0: Stream

Visitor Stream Implementation - Concreteclass VisitorStream<T> implements Stream<T> {

private Visitable<T> source;

public VisitorStream(Visitable<T> source) { this.source = source; } ...

}

Page 21: JavaZone 2014 - Iteration 2.0: Stream

Stream Method Categories

Reduce

• max• min• reduce• count

Iterator

• iterator• spliterator

Concurrency

• sequential• paralell

Output

• toArray

Pipeline

• filter• map• flatMap• skip(long)

Stateful

• sorted• distinct• ordered

Short circuit

• *Match(Predicate)

• limit(int)• find*

Iteration

• forEach✔

✔ ✔

✔ ✔✔

public void forEach(Consumer<? super T> action) { this.source.accept(item -> action.accept(item)); }

interface SplitVisitable<T> { Collection<Visitable<T>> split();}

interface Visitor<T> { void visit(T node);

}

default boolean isDone(){ return false; }

Certified 100%

Iterator Free

Provider VisitorStream Filter Map

implements SortedVisitable ... implements DistinctVisitable ...implements OrderedVisitable ...

Page 22: JavaZone 2014 - Iteration 2.0: Stream

Summary

• Many advantages to internal iteration– Control– Simplified implementation– Nice abstraction

• Streams are powerful– Create your own – it is not that hard

Page 23: JavaZone 2014 - Iteration 2.0: Stream

Thank You for Your Time!

Martin SkarsauneJava Developer and Co-Owner