Java8 - Advanced Stream...

35

Transcript of Java8 - Advanced Stream...

Page 1: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Java8Advanced Stream Techniques

Сергей Куксенко

[email protected], @kuksenk0

Page 2: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

The following is intended to outline our general product direction. Itis intended for information purposes only, and may not beincorporated into any contract. It is not a commitment to deliver anymaterial, code, or functionality, and should not be relied upon inmaking purchasing decisions. The development, release, and timingof any features or functionality described for Oracle’s productsremains at the sole discretion of Oracle.

Slide 2/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 3: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Stream Design

Slide 3/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 4: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Stream design

I like to look at this as having chosen a design center that recognizesthat sequential is a degenerate case of parallel, rather than treatingparallel as the “weird bonus mode”. I realize that this choice wascontroversial and definitely caused some compromises, but eventuallypeople will have to start to unlearn their sequential biases, andthere’s no time like the present.

(c) Brian Goetz

http://mail.openjdk.java.net/pipermail/lambda-dev/2014-February/011870.html

Slide 4/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 5: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Ordered/Unodered

Slide 5/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 6: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

forEach

collection.forEach(Consumer <T> action );

VS

stream.forEach(Consumer <T> action );

Slide 6/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 7: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

forEach

iterable.forEach(Consumer <T> action );

VS

stream.forEach(Consumer <T> action );

Slide 7/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 8: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Iterable.forEach

/**

* ... Unless otherwise specified by the implementing

* class , actions are performed in the order of

* iteration (if an iteration order is specified ).

* ...

*/

iterable.forEach(Consumer <T> action );

Slide 8/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 9: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Stream.forEach

/** ...

* The behavior of this operation is explicitly

* nondeterministic. For parallel stream pipelines ,

* this operation does not guarantee to respect the

* encounter order of the stream , as doing so would

* sacrifice the benefit of parallelism.

* If the action accesses shared state , it is

* responsible for providing the required

* synchronization.

* ...

*/

stream.forEach(Consumer <T> action );

Slide 9/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 10: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Stream.forEachOrdered

/** ...

* This operation processes the elements one at

* a time , in encounter order if one exists.

* Performing the action for one element happens -before

* performing the action for subsequent elements ,

* but for any given element , the action may be

* performed in whatever thread the library chooses.

* ...

*/

stream.forEachOrdered(Consumer <T> action );

Slide 10/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 11: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

Slide 11/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 12: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

List <Long > list;

public List <Long > oldSchool () {

List <Long > l = new ArrayList <>();

for (Long v : list) {

if ((v & 0xff) == 0) {

l.add(v);

}

}

return l;

}

Slide 12/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 13: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

Sequential/Ordered

list.stream ()

.filter(x -> (x & 0xff) == 0)

.collect(Collectors.toList ());

Slide 13/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 14: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

Sequential/Unordered

list.stream ()

.unordered ()

.filter(x -> (x & 0xff) == 0)

.collect(Collectors.toList ());

Slide 14/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 15: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

Parallel/Ordered

list.parallelStream ()

.filter(x -> (x & 0xff) == 0)

.collect(Collectors.toList ());

Slide 15/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 16: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo0

Parallel/Unordered

list.parallelStream ()

.unordered ()

.filter(x -> (x & 0xff) == 0)

.collect(Collectors.toList ());

Slide 16/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 17: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Results

list == range from 0 to 10000000;

oldSchool 13Sequential/Ordered 10Sequential/Unordered 10Parallel/Ordered 20Parallel/Unordered 26

throughput, ops/sec

Slide 17/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 18: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Spliterator или что у Stream’а под капотом

Slide 18/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 19: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Spliterator

interface Spliterator <T> {

...

long estimateSize (); // Long.MAX_VALUE if unknown

boolean tryAdvance(Consumer <T> action );

Spliterator <T> trySplit ();

int characteristics ();

...

}

Slide 19/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 20: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Характеристки Stream’а (Spliterator’а)

ORDERED

DISTINCT

SORTED

SIZED

SUBSIZED

NONNULL

IMMUTABLE

CONCURRENT

Slide 20/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 21: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1

Slide 21/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 22: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1

Как получить сумму четных чисел Фибоначчи

не превышающих 4000000 1 ?

1http://projecteuler.netSlide 22/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 23: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1

Как получить сумму четных чисел Фибоначчи

не превышающих 𝑁?

Slide 23/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 24: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1 prequel

Получить Фибоначчи Stream

Сложить первые 4096 элементов

Slide 24/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 25: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1 prequel results

sum of limit(4096)

’no load’

’heavy load’

OldSchool 849

55

Generator/Sequential 804

53

Iterator/Sequential 760

53

Iterate/Sequential 662

54

Iterator/Parallel 219

105

Iterate/Parallel 223

106

throughput, ops/sec

Slide 25/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 26: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1 prequel results

sum of limit(4096)

’no load’ ’heavy load’OldSchool 849 55Generator/Sequential 804 53Iterator/Sequential 760 53Iterate/Sequential 662 54Iterator/Parallel 219 105Iterate/Parallel 223 106

throughput, ops/sec

Slide 25/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 27: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1 results

𝑁 = 4 * 102048

’no load’

’heavy load’

OldSchool 239

56

Iterator/Sequential 225

55

Iterate/Sequential 216

54

Iterator/Parallel 208

72

Iterate/Parallel 209

72

throughput, ops/sec

Slide 26/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 28: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo1 results

𝑁 = 4 * 102048

’no load’ ’heavy load’OldSchool 239 56Iterator/Sequential 225 55Iterate/Sequential 216 54Iterator/Parallel 208 72Iterate/Parallel 209 72

throughput, ops/sec

Slide 26/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 29: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Demo2

Slide 27/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 30: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

MonteCarlo

𝜋 = 4× 𝑀𝑁

𝑁 - брошено𝑀 - попало

Slide 28/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 31: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

MonteCarlo results

OldSchool 14ZipBoxed/Sequential 126ZipDouble/Sequential 23ZipDouble/Parallel 20ZipUnsafe/Sequential 24ZipUnsafe/Parallel 9ZipPaired/Sequential 22ZipPaired/Parallel 8

time, secs/op

Slide 29/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 32: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Leibniz

𝜋4 =

∑︀∞𝑛=0

(−1)𝑛

2𝑛+1

Slide 30/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 33: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Leibniz results

OldSchool 1175Stream/Sequential 1507Stream/Parallel 600

time, ms/op

Slide 31/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 34: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Thank you!

Slide 32/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

Page 35: Java8 - Advanced Stream Techniquesjeeconf.com/wp-content/uploads/slides/advanced-streams-2014.pdf · Java8 Advanced Stream Techniques Ñåðãåé Êóêñåíêî sergey.kuksenko@oracle.com,

Q & A ?

Slide 33/33. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.