Your SlideShare is downloading. ×

JDK8: Stream style

2,190

Published on

JDK8 is bringing lambdas into the Java world. But without significant Java SE 8 libraries extensions lambdas would be only a toy. The centerpiece of the new libraries is the Streams API (formerly …

JDK8 is bringing lambdas into the Java world. But without significant Java SE 8 libraries extensions lambdas would be only a toy. The centerpiece of the new libraries is the Streams API (formerly ‘Collections bulk operations’). This session presents the Streams API and examples how to get the best performance and scalability using the library.

2 Comments
12 Likes
Statistics
Notes
  • The upper section is the same as lower section. Both are legal.
    http://download.java.net/jdk8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Slide 70. Are you explaining how a legit form is internally interpreted ?
    The lower section is illegal. Right ? I could not understand this.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,190
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
56
Comments
2
Likes
12
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Java8: Stream Style Sergey Kuksenko sergey.kuksenko@oracle.com, @kuksenk0
  • 2. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Slide 2/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 3. Motivation Slide 3/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 4. Motivation Everything is well. Why do we need any Streams? Slide 4/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 5. Motivation Everything is well. Why do we need any Streams? public void printGroups(List <People > people) { Set <Group > groups = new HashSet <>(); for (People p : people) { if (p.getAge () >= 65) groups.add(p.getGroup ()); } List <Group > sorted = new ArrayList <>(groups ); Collections.sort(sorted , new Comparator <Group >() { public int compare(Group a, Group b) { return Integer.compare(a.getSize(), b.getSize ()) } }); for (Group g : sorted) System.out.println(g.getName ()); } Slide 4/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 6. Motivation It would be awesome to omit miles and miles of duplicated code. public void printGroups(List <People > people) { people.stream () .filter(p -> p.getAge () > 65) .map(p -> p.getGroup ()) .distinct () .sorted(comparing(g -> g.getSize ())) .map(g -> g.getName ()) .forEach(n -> System.out.println(n)); } Slide 5/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 7. Motivation It would be awesome to do less work, and do it later (laziness). public void printGroups(List <People > people) { people.stream () .filter(p -> p.getAge () > 65) .map(p -> p.getGroup ()) .distinct () .sorted(comparing(g -> g.getSize ())) .map(g -> g.getName ()) .forEach(n -> System.out.println(n));//⇐ ACTIONS! } Slide 6/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 8. Motivation Parallelism? Collection <Item > data; ... for(int i=0; i < data.size (); i++) { processItem(data.get(i)); } Slide 7/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 9. Motivation Parallelism? Collection <Item > data; ... for(Item item : data) { processItem(item); } Slide 8/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 10. Motivation Parallelism? Collection <Item > data; ... #pragma omg parallel for(Item item : data) { processItem(item); } Slide 9/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 11. Motivation Parallelism? Collection <Item > data; ... #pragma omp parallel for(Item item : data) { processItem(item); } Slide 10/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 12. Motivation Parallelism? Collection <Item > data; ... parallel_for(Item item : data) { processItem(item); } Slide 11/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 13. Motivation Parallelism! Collection <Item > data; ... data.parallelStream () .forEach(item -> processItem(item )); Slide 12/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 14. Design Slide 13/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 15. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 16. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 17. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 18. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 → 𝑜𝑝 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 19. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 → 𝑜𝑝 → Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 20. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 → 𝑜𝑝 → 𝑔𝑎𝑛𝑔𝑛𝑎𝑚𝑠𝑡𝑦𝑙𝑒 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 21. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 → 𝑜𝑝 → 𝑠𝑖𝑛𝑘 Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 22. Design Most of the code fits the same simple pattern 𝑠𝑜𝑢𝑟𝑐𝑒 → 𝑜𝑝 → 𝑜𝑝 → 𝑜𝑝 → 𝑠𝑖𝑛𝑘 “sources”: collections, iterators, channels, ... “operations”: filter, map, reduce, ... “sinks”: collections, locals, ... Slide 14/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 23. Sources Standard classes? not-yet-created classes? 3 𝑟𝑑 party classes? Slide 15/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 24. Sources Standard classes? not-yet-created classes? 3 𝑟𝑑 party classes? Collection? should we put everything into collection? Slide 15/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 25. Sources Standard classes? not-yet-created classes? 3 𝑟𝑑 party classes? Collection? should we put everything into collection? Iterable? “Iterator Hell” (inherently sequential) interface pollution Slide 15/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 26. Sources Standard classes? not-yet-created classes? 3 𝑟𝑑 party classes? Collection? should we put everything into collection? Iterable? “Iterator Hell” (inherently sequential) interface pollution Stream! new (just invented) interface with required semantic inject the only stream() method into existing classes Slide 15/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 27. Stream Slide 16/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 28. Stream “A multiplicity of values” Not a collection (no storage) Operations are deferred as long as possible May be infinite Source is unmodifiable Can be used only once Ordered/Unordered Parallel/Sequential Primitive specializations: IntStream, LongStream, DoubleStream Slide 17/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 29. Stream pipeline 𝑎 𝑠𝑜𝑢𝑟𝑐𝑒: Source → Stream 𝑖𝑛𝑡𝑒𝑟𝑚𝑒𝑑𝑖𝑎𝑡𝑒 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛𝑠: Stream → Stream 𝑎 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛: Stream → PROFIT! public void printGroups(List <People > people) { people.stream() .filter(p -> p.getAge () > 65) .map(p -> p.getGroup ()) .distinct() .sorted(comparing(g -> g.getSize ())) .map(g -> g.getName ()) .forEach(n -> System.out.println(n)); } Slide 18/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 30. Stream pipeline 𝑎 𝑠𝑜𝑢𝑟𝑐𝑒: Source → Stream 𝑖𝑛𝑡𝑒𝑟𝑚𝑒𝑑𝑖𝑎𝑡𝑒 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛𝑠: Stream → Stream 𝑎 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛: Stream → PROFIT! public void printGroups(List <People > people) { people.stream() .filter(p -> p.getAge () > 65) .map(p -> p.getGroup ()) .distinct() .sorted(comparing(g -> g.getSize ())) .map(g -> g.getName ()) .forEach(n -> System.out.println(n)); } Slide 18/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 31. Stream pipeline 𝑎 𝑠𝑜𝑢𝑟𝑐𝑒: Source → Stream 𝑖𝑛𝑡𝑒𝑟𝑚𝑒𝑑𝑖𝑎𝑡𝑒 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛𝑠: Stream → Stream 𝑎 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛: Stream → PROFIT! public void printGroups(List <People > people) { people.stream() .filter(p -> p.getAge () > 65) .map(p -> p.getGroup ()) .distinct() .sorted(comparing(g -> g.getSize ())) .map(g -> g.getName ()) .forEach(n -> System.out.println(n)); } Slide 18/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 32. Stream pipeline 𝑎 𝑠𝑜𝑢𝑟𝑐𝑒: Source → Stream 𝑖𝑛𝑡𝑒𝑟𝑚𝑒𝑑𝑖𝑎𝑡𝑒 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛𝑠: Stream → Stream 𝑎 𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑙 𝑜𝑝𝑒𝑟𝑎𝑡𝑖𝑜𝑛: Stream → PROFIT! public void printGroups(List <People > people) { Stream <People > s1 = people.stream (); Stream <People > s2 = s1.filter(p -> p.getAge () > 65); Stream <Group > s3 = s2.map(p -> p.getGroup ()); Stream <Group > s4 = s3.distinct (); Stream <Group > s5 = s4.sorted(comparing(g->g.getSize ())); Stream <String > s6 = s5.map(g -> g.getName ()); s6.forEach(n -> System.out.println(n)); } Slide 19/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 33. Stream Sources Slide 20/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 34. Stream Sources: collections ArrayList <T> list; Stream <T> s = list.stream (); // sized , ordered Slide 21/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 35. Stream Sources: collections ArrayList <T> list; Stream <T> s = list.stream (); // sized , ordered HashSet <T> set; Stream <T> s = set.stream (); // sized , distinct Slide 21/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 36. Stream Sources: collections ArrayList <T> list; Stream <T> s = list.stream (); // sized , ordered HashSet <T> set; Stream <T> s = set.stream (); // sized , distinct TreeSet <T> set; Stream <T> s = set.stream (); // sized , distinct // sorted , ordered Slide 21/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 37. Stream Sources: factories, builders T[] arr; Stream <T> s = Arrays.stream(arr); Slide 22/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 38. Stream Sources: factories, builders T[] arr; Stream <T> s = Arrays.stream(arr); Stream <T> s = Stream.of(v0, v1, v2); Slide 22/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 39. Stream Sources: factories, builders T[] arr; Stream <T> s = Arrays.stream(arr); Stream <T> s = Stream.of(v0, v1, v2); Stream <T> s = Stream.builder () .add(v0).add(v1).add(v2) .build (); Slide 22/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 40. Stream Sources: factories, builders T[] arr; Stream <T> s = Arrays.stream(arr); Stream <T> s = Stream.of(v0, v1, v2); Stream <T> s = Stream.builder () .add(v0).add(v1).add(v2) .build (); IntStream s = IntStream.range(0, 100); Slide 22/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 41. Stream Sources: generators AtomicInteger init = new AtomicInteger (0); Stream <Integer > s = Stream.generate(init:: getAndIncrement ); Slide 23/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 42. Stream Sources: generators AtomicInteger init = new AtomicInteger (0); Stream <Integer > s = Stream.generate(init:: getAndIncrement ); Stream <Integer > s = Stream.iterate(0, i -> i+1); Slide 23/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 43. Stream Sources: others Stream <String > s = bufferedReader.lines (); Slide 24/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 44. Stream Sources: others Stream <String > s = bufferedReader.lines (); Stream <String > s = Pattern.compile(myRegEx) .splitAsStream(myStr); Slide 24/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 45. Stream Sources: others Stream <String > s = bufferedReader.lines (); Stream <String > s = Pattern.compile(myRegEx) .splitAsStream(myStr); DoubleStream s = new SplittableRandom (). doubles (); Slide 24/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 46. Intermediate Operations Slide 25/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 47. Intermediate Operations Stream <S> s; Stream <S> s.filter(Predicate <S>); Stream <T> s.map(Function <S, T>); Stream <T> s.flatMap(Function <S, Stream <T>>); Stream <S> s.peek(Consumer <S>); Stream <S> s.sorted (); Stream <S> s.distinct (); Stream <S> s.limit(long); Stream <S> s.skip(long); Slide 26/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 48. Intermediate Operations Stream <S> s; Stream <S> s.filter(Predicate <S>); Stream <T> s.map(Function <S, T>); Stream <T> s.flatMap(Function <S, Stream <T>>); Stream <S> s.peek(Consumer <S>); Stream <S> s.sorted (); Stream <S> s.distinct (); Stream <S> s.limit(long); Stream <S> s.skip(long); Stream <S> s.unordered (); Stream <S> s.parallel (); Stream <S> s.sequential (); Slide 26/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 49. Terminal Operations a.k.a. PROFIT Slide 27/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 50. Terminal Operations Terminal operations yield final result Parallel or sequential execution Terminal operations ’flavors’: iteration: forEach, iterator searching: findFirst, findAny matching: allMatch, anyMatch, noneMatch aggregation: 𝑟𝑒𝑑𝑢𝑐𝑡𝑖𝑜𝑛 𝑐𝑜𝑙𝑙𝑒𝑐𝑡𝑜𝑟𝑠 Slide 28/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 51. Short-circuiting Do not consume the entire stream, drop it on the floor as necessary May operate infinite streams find*, *Match, limit e.g.: int v = Stream.iterate(1, i -> i+1) .filter( i % 2 == 0) .findFirst (). get(); Slide 29/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 52. Iteration Process each stream element: IntStream.range(0, 100) .forEach(System.out:: println ); Convert to old style iterator 1 : Iterator <Integer > = Stream.iterate(0, i -> i + 1) .limit (100) .iterator (); 1for compatibility Slide 30/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 53. Example How to compute a sum over Stream<Integer>? Slide 31/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 54. Example How to compute a sum over Stream<Integer>? public int getSum(Stream <Integer > s){ int sum; s.forEach( i -> sum += i); return sum; } Slide 31/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 55. Example How to compute a sum over Stream<Integer>? public int getSum(Stream <Integer > s){ int sum; s.forEach( i -> sum += i); // Compile error return sum; } Slide 32/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 56. Example How to compute a sum over Stream<Integer>? public int getSum(Stream <Integer > s){ int[] sum = new int [1]; s.forEach( i -> sum[0] += i); return sum [0]; } Slide 33/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 57. Example Result? Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1); System.out.println(getSum(s)); Slide 34/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 58. Example Result? Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1); System.out.println(getSum(s)); 100 Slide 34/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 59. Example Result? Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1); System.out.println(getSum(s)); 100 Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1) .parallel (); System.out.println(getSum(s)); Slide 34/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 60. Example Result? Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1); System.out.println(getSum(s)); 100 Stream <Integer > s = IntStream.range(0, 100) .mapToObj(i -> 1) .parallel (); System.out.println(getSum(s)); 79, 63, 100, ... Slide 34/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 61. Reduction Take a stream and make a scalar value: Stream <Integer > s; Integer sum = s.reduce(0, (x, y) -> x + y); Slide 35/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 62. Reduction Take a stream and make a scalar value: Stream <Integer > s; Integer sum = s.reduce(0, (x, y) -> x + y); Some operations return Optional<T>: Stream <Integer > s; Optional <Integer > sum = s.reduce ((x, y) -> x + y); Slide 35/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 63. Reduction Stream <T> { ... <U> U reduce(U identity , BiFunction <U,T,U> accumulator , BinaryOperator <U> combiner) ... } Slide 36/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 64. Collectors A.k.a. mutable reduction operations Accumulate elements into a mutable result container: List <Integer > list = IntStream.range(0, 100) .boxed () .collect(Collectors.toList ()); int[] ints = IntStream.range(0, 100). toArray (); Slide 37/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 65. Collectors A.k.a. mutable reduction operations Accumulate elements into a mutable result container: List <Integer > list = IntStream.range(0, 100) .boxed () .collect(Collectors.toList ()); int[] ints = IntStream.range(0, 100). toArray (); Complex collections: Map <Integer ,Integer > map = IntStream.range(0, 100) .boxed (). collect( Collectors.toConcurrentMap( k -> k % 42, v -> v, (a, b) -> b ) ); Slide 37/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 66. java.util.stream.Collectors More than 30 predefined collectors, e.g.: collector => result of Stream<T>.collect(collector) toList () => List toSet() => Set toCollection(Supplier <Collection <T>>) => Collection <T> partitioningBy(Predicate <T>) => Map <Boolean , List <T>> groupingBy(Function <T,K>) => Map <K, List <T>>> toMap(Function <T,K>, Function <T,U>) => Map <K,U> Slide 38/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 67. Collectors String [] a = new String []{"a", "b", "c"}; Hot to get "a,b,c"? Slide 39/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 68. Collectors String [] a = new String []{"a", "b", "c"}; Hot to get "a,b,c"? Arrays.stream(a). collect(Collectors.joining(",")); Slide 39/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 69. Collectors String [] a = new String []{"a", "b", "c"}; Hot to get "a,b,c"? Arrays.stream(a). collect(Collectors.joining(",")); FYI: java.util.StringJoiner Slide 39/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 70. Collectors Stream <T> { ... <R> R collect(Supplier <R> supplier , BiConsumer <R, T> accumulator , BiConsumer <R, R> combiner) ... } Slide 40/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 71. Collectors Stream <T> s; List <T> l = s.collect(Collectors.toList ()); ⇓ l = collect( () -> new ArrayList <>(), (list , t) -> list.add(t), (l1 , l2) -> l1.addAll(l2)); Slide 41/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 72. Collectors Stream <T> s; List <T> l = s.collect(Collectors.toList ()); ⇓ l = collect( () -> new ArrayList <>(), (list , t) -> list.add(t), (l1 , l2) -> l1.addAll(l2)); ⇓ l = collect( ArrayList ::new , List::add , List:: addAll ); Slide 41/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 73. Parallelism Slide 42/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 74. Parallelism Lots of sources are naturally splittable Lots of operations are well parallelizable Streams will do it for us “ForkJoinPool inside” Have to ask for the parallelism explicitly int v = list.parallelStream () .reduce(Math::max) .get(); Slide 43/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 75. Explicit parallelism Q: Why not implicit? A: Final speedup depends on: 𝑁 – number of source elements 𝑄 – cost of operation 𝑃 – available HW parallelism 𝐶 – number of concurrent clients We know 𝑁. We can estimate 𝑃. We can somehow cope with 𝐶 𝑄 is almost not predictable. Slide 44/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 76. Thank you! Slide 45/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 77. Q & A ? Slide 46/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 78. Appendix Slide 47/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 79. Spliterator Slide 48/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 80. Spliterator interface Spliterator <T> { ... long estimateSize (); // Long.MAX_VALUE if unknown boolean tryAdvance(Consumer <T> action ); Spliterator <T> trySplit (); int characteristics (); ... } Slide 49/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 81. Spliterator’s characteristic ORDERED DISTINCT SORTED SIZED SUBSIZED NONNULL IMMUTABLE CONCURRENT Slide 50/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.
  • 82. Stream design I like to look at this as having chosen a design center that recognizes that sequential is a degenerate case of parallel, rather than treating parallel as the “weird bonus mode”. I realize that this choice was controversial and definitely caused some compromises, but eventually people will have to start to unlearn their sequential biases, and there’s no time like the present. (c) Brian Goetz http://mail.openjdk.java.net/pipermail/lambda-dev/2014-February/011870.html Slide 51/51. Copyright c○ 2014, Oracle and/or its affiliates. All rights reserved.

×