java 8, streams & collectors, patterns, performances and parallelization
DESCRIPTION
The slide deck of the talk I gave in Devoxx 2014TRANSCRIPT
![Page 1: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/1.jpg)
Java 8 Streams & Collectors Patterns, performance, parallelization
@JosePaumard
![Page 2: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/2.jpg)
@JosePaumard
![Page 3: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/3.jpg)
@JosePaumard
Stream
![Page 4: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/4.jpg)
@JosePaumard
Stream Collectors
![Page 5: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/5.jpg)
@JosePaumard
Stream Collectors
![Page 6: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/6.jpg)
![Page 7: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/7.jpg)
![Page 8: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/8.jpg)
![Page 9: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/9.jpg)
![Page 10: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/10.jpg)
@JosePaumard #J8Stream
Code & slides
1st part: slides
- Stream
- Operations
- State
- Reduction
- Collectors
2nd part: live coding!
- Movies & actors
- Shakespeare
![Page 11: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/11.jpg)
Questions ?
#J8Stream
@JosePaumard
![Page 12: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/12.jpg)
@JosePaumard
Stream
![Page 13: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/13.jpg)
@JosePaumard #J8Stream
What is a stream?
![Page 14: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/14.jpg)
@JosePaumard #J8Stream
What is a stream?
Answer 1: a typed interface
public interface Stream<T> extends BaseStream<T, Stream<T>> { // ... }
![Page 15: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/15.jpg)
@JosePaumard #J8Stream
What is a stream?
Answer 1: a typed interface
In fact: a new concept in the JDK
public interface Stream<T> extends BaseStream<T, Stream<T>> { // ... }
![Page 16: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/16.jpg)
@JosePaumard #J8Stream
What is a stream?
What can I do with it?
![Page 17: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/17.jpg)
@JosePaumard #J8Stream
What is a stream?
What can I do with it?
Answer: efficiently process high volumes of data, but also small ones
![Page 18: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/18.jpg)
@JosePaumard #J8Stream
What is a stream?
What does efficiently mean?
![Page 19: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/19.jpg)
@JosePaumard #J8Stream
What is a stream?
What does efficiently mean?
Two things:
![Page 20: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/20.jpg)
@JosePaumard #J8Stream
What is a stream?
What does efficiently mean?
Two things:
1) in parallel, to leverage multicore CPU
![Page 21: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/21.jpg)
@JosePaumard #J8Stream
What is a stream?
What does efficiently mean?
Two things:
1) in parallel, to leverage multicore CPU
2) in pipeline, to avoid the computation of intermediate data structures
![Page 22: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/22.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
![Page 23: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/23.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
In fact there are arguments for a Collection to be a Stream!
![Page 24: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/24.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
In fact there are arguments for a Collection to be a Stream!
1) this is where my data is!
![Page 25: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/25.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
In fact there are arguments for a Collection to be a Stream!
1) this is where my data is!
2) and I know the Collection API pretty well…
![Page 26: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/26.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
Two reasons:
1) we want to be free to create new concepts
![Page 27: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/27.jpg)
@JosePaumard #J8Stream
What is a stream?
Why cant a collection be a stream?
Two reasons:
1) we want to be free to create new concepts
2) we dont want to add those concepts on well-known interfaces
![Page 28: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/28.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
![Page 29: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/29.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
1) an object on which I can define operations
![Page 30: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/30.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
1) an object on which I can define operations
2) that does not hold any data
![Page 31: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/31.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
1) an object on which I can define operations
2) that does not hold any data
3) that will not modify the data it processes
![Page 32: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/32.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
1) an object on which I can define operations
2) that does not hold any data
3) that will not modify the data it processes
4) that will process data in « one pass »
![Page 33: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/33.jpg)
@JosePaumard #J8Stream
So: what is a Stream?
Answers:
1) an object on which I can define operations
2) that does not hold any data
3) that will not modify the data it processes
4) that will process data in « one pass »
5) that is built on higly optimized algorithms, and that can work in parallel
![Page 34: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/34.jpg)
@JosePaumard #J8Stream
How can I build a Stream?
Many patterns!
![Page 35: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/35.jpg)
@JosePaumard #J8Stream
How can I build a Stream?
Many patterns!
Let us take one: List<Person> persons = ... ; Stream<Person> stream = persons.stream() ;
![Page 36: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/36.jpg)
@JosePaumard #J8Stream
Operations on a Stream
Let us see a first operation: forEach()
… that will display each person
List<Person> persons = ... ; Stream<Person> stream = persons.stream() ; stream.forEach(p -> System.out.println(p)) ;
![Page 37: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/37.jpg)
@JosePaumard #J8Stream
Operations on a Stream
Let us see a first operation: forEach()
… that will display each person
List<Person> persons = ... ; Stream<Person> stream = persons.stream() ; stream.forEach(System.out::println) ;
![Page 38: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/38.jpg)
@JosePaumard #J8Stream
Operations on a Stream
Let us see a first operation: forEach()
… that will display each person
List<Person> persons = ... ; Stream<Person> stream = persons.stream() ; stream.forEach(System.out::println) ;
o -> System.out.println(o) ≡ System.out::println
![Page 39: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/39.jpg)
@JosePaumard #J8Stream
Operation: forEach()
First operation: forEach()
forEach(): takes a Consumer<T> as a parameter @FunctionalInterface public interface Consumer<T> { void accept(T t) ; }
![Page 40: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/40.jpg)
@JosePaumard #J8Stream
Operation: forEach()
First operation: forEach()
forEach(): takes a Consumer<T> as a parameter
What is a functional interface?
@FunctionalInterface public interface Consumer<T> { void accept(T t) ; }
![Page 41: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/41.jpg)
@JosePaumard #J8Stream
Functional interface
Definition:
an interface with only one abstract method
![Page 42: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/42.jpg)
@JosePaumard #J8Stream
Functional interface
Definition:
an interface with only one abstract method
(methods from Object do not count)
![Page 43: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/43.jpg)
@JosePaumard #J8Stream
Functional interface
Definition:
an interface with only one abstract method
(methods from Object do not count)
(default & static methods do not count)
![Page 44: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/44.jpg)
@JosePaumard #J8Stream
Functional interface
Definition:
an interface with only one abstract method
(methods from Object do not count)
(default & static methods do not count)
It « can » be annotated by @FunctionalInterface
![Page 45: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/45.jpg)
@JosePaumard #J8Stream
Functional interface
Definition:
an interface with only one abstract method
(methods from Object do not count)
(default & static methods do not count)
It « can » be annotated by @FunctionalInterface
If present: the Java 8 compiler will help me
![Page 46: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/46.jpg)
@JosePaumard #J8Stream
In fact…
Consumer is a bit more complex than that:
@FunctionalInterface public interface Consumer<T> { void accept(T t) ; default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
![Page 47: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/47.jpg)
@JosePaumard #J8Stream
In fact…
What is a default method?
@FunctionalInterface public interface Consumer<T> { void accept(T t) ; default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
![Page 48: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/48.jpg)
@JosePaumard #J8Stream
Default methods
New concept in Java 8!
![Page 49: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/49.jpg)
@JosePaumard #J8Stream
Default methods
New concept in Java 8!
Added to allow the adding of methods in interfaces without breaking the old implementations
![Page 50: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/50.jpg)
@JosePaumard #J8Stream
Default methods
New concept in Java 8!
Added to allow the adding of methods in interfaces without breaking the old implementations
Ex: stream() on the Collection interface
![Page 51: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/51.jpg)
@JosePaumard #J8Stream
Collection.stream()
public interface Collection<E> { default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } }
![Page 52: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/52.jpg)
@JosePaumard #J8Stream
Collection.stream()
public interface Collection<E> { default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); } }
![Page 53: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/53.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
@FunctionalInterface public interface Consumer<T> { void accept(T t) ; default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
![Page 54: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/54.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
List<String> list = new ArrayList<>() ; Consumer<String> c1 = s -> list.add(s) ; Consumer<String> c2 = s -> System.out.println(s) ;
![Page 55: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/55.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
List<String> list = new ArrayList<>() ; Consumer<String> c1 = list::add ; Consumer<String> c2 = System.out::println ;
![Page 56: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/56.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
List<String> list = new ArrayList<>() ; Consumer<String> c1 = list::add ; Consumer<String> c2 = System.out::println ; Consumer<String> c3 = c1.andThen(c2) ; // and we could chain more
![Page 57: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/57.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
Beware concurrency!
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; Consumer<String> c1 = list::add ; persons.stream() .forEach(c1) ; // concurrency?
![Page 58: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/58.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
Beware concurrency!
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; Consumer<String> c1 = list::add ; persons.stream().parallel() .forEach(c1) ; // concurrency?
![Page 59: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/59.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
Beware concurrency!
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; Consumer<String> c1 = list::add ; persons.stream().parallel() .forEach(c1) ; // concurrency? Baaaad pattern!
![Page 60: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/60.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
Problem: forEach() returns void
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; Consumer<String> c1 = list::add ; Consumer<String> c2 = System.out::println persons.stream() .forEach(c1.andThen(c2)) ;
![Page 61: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/61.jpg)
@JosePaumard #J8Stream
Back to the Consumer interface
But I also have a peek() method
That returns another Stream
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; persons.stream() .peek(System.out::println) .filter(person -> person.getAge() > 20) .peek(result::add) ; // Baaad pattern !
![Page 62: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/62.jpg)
@JosePaumard #J8Stream
Back to Stream
So far we saw:
- forEach(Consumer)
- peek(Consumer)
![Page 63: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/63.jpg)
@JosePaumard #J8Stream
Back to Stream
3rd method: filter(Predicate)
![Page 64: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/64.jpg)
@JosePaumard #J8Stream
Method filter()
3rd method: filter(Predicate)
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 65: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/65.jpg)
@JosePaumard #J8Stream
Method filter()
3rd method: filter(Predicate)
Predicate<Person> p = person -> person.getAge() > 20 ;
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 66: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/66.jpg)
@JosePaumard #J8Stream
Interface Predicate
Another functional interface
@FunctionalInterface public interface Predicate<T> { boolean test(T t) ; }
![Page 67: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/67.jpg)
@JosePaumard #J8Stream
Interface Predicate
In fact Predicate looks like this:
@FunctionalInterface public interface Predicate<T> { boolean test(T t) ; default Predicate<T> and(Predicate<? super T> other) { ... } default Predicate<T> or(Predicate<? super T> other) { ... } default Predicate<T> negate() { ... } }
![Page 68: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/68.jpg)
@JosePaumard #J8Stream
Interface Predicate
default Predicate<T> and(Predicate<? super T> other) { return t -> test(t) && other.test(t) ; }
default Predicate<T> or(Predicate<? super T> other) { return t -> test(t) || other.test(t) ; }
default Predicate<T> negate() { return t -> !test(t) ; }
![Page 69: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/69.jpg)
@JosePaumard #J8Stream
Interface Predicate: patterns
Predicate<Integer> p1 = i -> i > 20 ; Predicate<Integer> p2 = i -> i < 30 ; Predicate<Integer> p3 = i -> i == 0 ;
![Page 70: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/70.jpg)
@JosePaumard #J8Stream
Interface Predicate: patterns
Predicate<Integer> p1 = i -> i > 20 ; Predicate<Integer> p2 = i -> i < 30 ; Predicate<Integer> p3 = i -> i == 0 ; Predicate<Integer> p = p1.and(p2).or(p3) ; // (p1 AND p2) OR p3
![Page 71: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/71.jpg)
@JosePaumard #J8Stream
Interface Predicate: patterns
Predicate<Integer> p1 = i -> i > 20 ; Predicate<Integer> p2 = i -> i < 30 ; Predicate<Integer> p3 = i -> i == 0 ; Predicate<Integer> p = p1.and(p2).or(p3) ; // (p1 AND p2) OR p3 Predicate<Integer> p = p3.or(p1).and(p2) ; // (p3 OR p1) AND p2
![Page 72: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/72.jpg)
@JosePaumard #J8Stream
Interface Predicate
In fact Predicate looks like this (bis):
@FunctionalInterface public interface Predicate<T> { boolean test(T t) ; // default methods static <T> Predicate<T> isEqual(Object o) { ... } }
![Page 73: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/73.jpg)
@JosePaumard #J8Stream
Interface Predicate
static <T> Predicate<T> isEqual(Object o) { return t -> o.equals(t) ; }
![Page 74: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/74.jpg)
@JosePaumard #J8Stream
Interface Predicate
In fact things are bit more complicated:
static <T> Predicate<T> isEqual(Object o) { return t -> o.equals(t) ; }
static <T> Predicate<T> isEqual(Object o) { return (null == o) ? obj -> Objects.isNull(obj) : t -> o.equals(t) ; }
![Page 75: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/75.jpg)
@JosePaumard #J8Stream
Interface Predicate
In fact things are bit more complicated:
static <T> Predicate<T> isEqual(Object o) { return t -> o.equals(t) ; }
static <T> Predicate<T> isEqual(Object o) { return (null == o) ? Objects::isNull : o::equals ; }
![Page 76: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/76.jpg)
@JosePaumard #J8Stream
Interface Predicate
We also have:
@FunctionalInterface public interface BiPredicate<T, U> { boolean test(T t, U u); }
![Page 77: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/77.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
stream and filtered are different objects
The filter() method returns a new object
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 78: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/78.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 1: what do we have in the filtered object?
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 79: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/79.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 1: what do we have in the filtered object?
Answer: the filtered data!
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 80: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/80.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 1: what do we have in the filtered object?
Answer: the filtered data… really?
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 81: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/81.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 1: what do we have in the filtered object?
Didnt we say: « a stream does not hold any data »?
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 82: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/82.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 1: what do we have in the filtered object?
Correct answer: nothing!
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 83: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/83.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 2: what does this code do?
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 84: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/84.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 2: what does this code do?
Answer: nothing…
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 85: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/85.jpg)
@JosePaumard #J8Stream
Filtered Streams
In this code:
Question 2: what does this code do?
Answer: nothing…
This call is a declaration, no data is processed!
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<Person> filtered = stream.filter(person -> person.getAge() > 20) ;
![Page 86: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/86.jpg)
@JosePaumard #J8Stream
Filtered Streams
The filter() call is a lazy call
Generally speaking:
A call to a method that returns a Stream is a lazy call
![Page 87: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/87.jpg)
@JosePaumard #J8Stream
Filtered Streams
The filter() call is a lazy call
Another way of saying it:
An operation that returns a Stream is an intermediate operation
![Page 88: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/88.jpg)
@JosePaumard #J8Stream
Intermediate call
Stating that a Stream does not hold any data
creates the notion of intermediate operation
adds the notion of lazyness to the Stream API
![Page 89: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/89.jpg)
@JosePaumard #J8Stream
Intermediate call
Stating that a Stream does not hold any data
creates the notion of intermediate operation
adds the notion of lazyness to the Stream API
There must be some kind terminal operation somewhere…
![Page 90: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/90.jpg)
@JosePaumard #J8Stream
Back to Consumer (bis)
What happens in that code?
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; persons.stream() .peek(System.out::println) .filter(person -> person.getAge() > 20) .peek(resultat::add) ; // Baaad pattern !
![Page 91: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/91.jpg)
@JosePaumard #J8Stream
Back to Consumer (bis)
What happens in that code?
Answer is: nothing!
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; persons.stream() .peek(System.out::println) .filter(person -> person.getAge() > 20) .peek(result::add) ; // Baaad pattern !
![Page 92: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/92.jpg)
@JosePaumard #J8Stream
Back to Consumer (bis)
What happens in that code?
1) nothing displayed
2) result is empty
List<String> result = new ArrayList<>() ; List<Person> persons = ... ; persons.stream() .peek(System.out::println) .filter(person -> person.getAge() > 20) .peek(result::add) ; // Baaad pattern !
![Page 93: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/93.jpg)
@JosePaumard #J8Stream
What do we have so far?
We saw:
- forEach(Consumer)
- peek(Consumer)
- filter(Predicate)
![Page 94: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/94.jpg)
@JosePaumard #J8Stream
What do we have so far?
We saw:
- forEach(Consumer)
- peek(Consumer)
- filter(Predicate)
The notion of lazyness / intermediate call
![Page 95: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/95.jpg)
@JosePaumard #J8Stream
Let us carry on
And see the mapping operation
![Page 96: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/96.jpg)
@JosePaumard #J8Stream
Mapping
Mapping operation
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<String> names = stream.map(person -> person.getName()) ;
![Page 97: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/97.jpg)
@JosePaumard #J8Stream
Mapping
Mapping operation
The map() method returns a Stream
It is thus lazy / intermediate
List<Person> list = ... ; Stream<Person> stream = list.stream() ; Stream<String> names = stream.map(person -> person.getName()) ;
![Page 98: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/98.jpg)
@JosePaumard #J8Stream
Interface Function
The map() method takes a Function:
@FunctionalInterface public interface Function<T, R> { R apply(T t) ; }
![Page 99: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/99.jpg)
@JosePaumard #J8Stream
Interface Function
Which in fact is:
@FunctionalInterface public interface Function<T, R> { R apply(T t) ; default <V> Function<V, R> compose(Function<V, T> before) ; default <V> Function<T, V> andThen(Function<R, V> after) ; }
![Page 100: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/100.jpg)
@JosePaumard #J8Stream
Interface Function
Which in fact is:
Beware the generics!
@FunctionalInterface public interface Function<T, R> { R apply(T t) ; default <V> Function<V, R> compose(Function<V, T> before) ; default <V> Function<T, V> andThen(Function<R, V> after) ; }
![Page 101: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/101.jpg)
@JosePaumard #J8Stream
Interface Function
Which in fact is:
@FunctionalInterface public interface Function<T, R> { R apply(T t) ; default <V> Function<V, R> compose( Function<? super V, ? extends T> before) ; default <V> Function<T, V> andThen( Function<? super R, ? extends V> after) ; }
![Page 102: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/102.jpg)
@JosePaumard #J8Stream
Interface Function
Which in fact is:
@FunctionalInterface public interface Function<T, R> { R apply(T t) ; // default methods static <T> Function<T, T> identity() { return t -> t ; } }
![Page 103: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/103.jpg)
@JosePaumard #J8Stream
Other functions
There are special types of functions:
@FunctionalInterface public interface UnaryOperator<T> extends Function<T, T> { }
![Page 104: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/104.jpg)
@JosePaumard #J8Stream
Other functions
There are special types of functions:
@FunctionalInterface public interface BiFunction<T, U, R> { R apply(T t, U u); }
![Page 105: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/105.jpg)
@JosePaumard #J8Stream
Other functions
There are special types of functions:
@FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T, T, T> { }
![Page 106: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/106.jpg)
@JosePaumard #J8Stream
What do we have so far?
We saw:
- forEach(Consumer)
- peek(Consumer)
- filter(Predicate)
- map(Function)
![Page 107: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/107.jpg)
@JosePaumard #J8Stream
Let us carry on
Method flatMap()
![Page 108: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/108.jpg)
@JosePaumard #J8Stream
Method flatMap()
flatMap() = flattens a Stream
The signature is:
The passed function returns a Stream
<R> Stream<R> flatMap(Function<T, Stream<R>> mapper) ;
![Page 109: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/109.jpg)
@JosePaumard #J8Stream
Method flatMap()
Let us take an example:
List<Movie> movies = ... ; // a movie has a set of Actor movies.stream() .map(movie -> movie.actors()) // Stream<Set<Actors>>
![Page 110: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/110.jpg)
@JosePaumard #J8Stream
Method flatMap()
Let us take an example:
List<Movie> movies = ... ; // a movie has a set of Actor movies.stream() .map(movie -> movie.actors().stream()) // Stream<Stream<Actors>>
![Page 111: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/111.jpg)
@JosePaumard #J8Stream
Method flatMap()
Let us take an example:
List<Movie> movies = ... ; // a movie has a set of Actor movies.stream() .map(movie -> movie.actors().stream()) // Stream<Stream<Actors>>
Function<Movie, Stream<Actors>> mapper = movie -> movie.actors().stream();
![Page 112: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/112.jpg)
@JosePaumard #J8Stream
Method flatMap()
Let us take an example:
List<Movie> movies = ... ; // a movie has a set of Actor movies.stream() .flatMap(movie -> movie.actors().stream()) // Stream<Actors>
![Page 113: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/113.jpg)
@JosePaumard #J8Stream
Method flatMap()
flatMap() = flattens a Stream
Signature:
<R> Stream<R> flatMap(Function<T, Stream<R>> mapper) ;
![Page 114: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/114.jpg)
@JosePaumard #J8Stream
Method flatMap()
flatMap() = flattens a Stream
Signature:
Since it returns a Stream, it is a lazy / intermediate call
<R> Stream<R> flatMap(Function<T, Stream<R>> mapper) ;
![Page 115: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/115.jpg)
@JosePaumard #J8Stream
What do we have so far?
We have 3 types of methods:
- forEach(): consumes
- peek(): consumes, and transmits
- filter(): filters
- map(): transforms
- flatMap(): transforms and flattens
![Page 116: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/116.jpg)
@JosePaumard #J8Stream
What do we have so far?
And what about reductions?
![Page 117: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/117.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 118: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/118.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
Two things to stress out here
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 119: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/119.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
Two things to stress out here
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, Intege::sum) ;
![Page 120: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/120.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
0 is the « default value » of the reduction operation
returned if the stream is « empty »
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 121: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/121.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
0 is the « default value » of the reduction operation
This « default value » has to be the identity element of the reduction operation
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 122: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/122.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
0 is the « default value » of the reduction operation
If it is not, then the computation will fail!
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 123: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/123.jpg)
@JosePaumard #J8Stream
Reduction
Why?
- This 0 is returned in case of an empty Stream
- Red(0, p) is returned in case of a singleton Stream
In fact, 0 is used to compute the reduction of the Stream
![Page 124: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/124.jpg)
@JosePaumard #J8Stream
Reduction
What is going to happen if the reduction operation has no identity value?
![Page 125: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/125.jpg)
@JosePaumard #J8Stream
Reduction
What is going to happen if the reduction operation has no identity value?
But of course we do not use such reductions…
![Page 126: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/126.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
The reduction operation should be associative
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 127: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/127.jpg)
@JosePaumard #J8Stream
Reduction
Reduction method:
The reduction operation should be associative
If not, we will have trouble in parallel
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
![Page 128: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/128.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ;
![Page 129: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/129.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ;
![Page 130: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/130.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ; red3 = (i1, i2) -> i1*i2 ;
![Page 131: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/131.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ; red3 = (i1, i2) -> i1*i2 ; red4 = (i1, i2) -> i1*i1 + i2*i2 ;
![Page 132: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/132.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ; red3 = (i1, i2) -> i1*i2 ; red4 = (i1, i2) -> i1*i1 + i2*i2 ; red5 = (i1, i2) -> (i1 + i2) / 2 ;
![Page 133: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/133.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ; red3 = (i1, i2) -> i1*i2 ; red4 = (i1, i2) -> i1*i1 + i2*i2 ; red5 = (i1, i2) -> (i1 + i2) / 2 ; red6 = (i1, i2) -> i2 ;
![Page 134: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/134.jpg)
@JosePaumard #J8Stream
Reduction
Associative, or not associative?
red1 = (i1, i2) -> i1 + i2 ; red2 = (i1, i2) -> i1 > i2 ? i1 : i2 ; red3 = (i1, i2) -> i1*i2 ; red4 = (i1, i2) -> i1*i1 + i2*i2 ; red5 = (i1, i2) -> (i1 + i2) / 2 ; red6 = (i1, i2) -> i2 ;
![Page 135: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/135.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, (age1, age2) -> age1 > age2 ? age1 : age2) ;
![Page 136: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/136.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, Integer::max) ;
![Page 137: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/137.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, (age1, age2) -> age1 > age2 ? age1 : age2) ;
List<Integer> ages = new ArrayList<>() ; Stream<Integer> stream = ages.stream() ; // empty stream > max = 0
![Page 138: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/138.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, (age1, age2) -> age1 > age2 ? age1 : age2) ;
List<Integer> ages = Arrays.asList(2) ; Stream<Integer> stream = ages.stream() ; // singleton stream > max = 2
![Page 139: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/139.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, (age1, age2) -> age1 > age2 ? age1 : age2) ;
List<Integer> ages = Arrays.asList(-1) ; Stream<Integer> stream = ages.stream() ; // singleton stream > max = 0
![Page 140: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/140.jpg)
@JosePaumard #J8Stream
Example of max
Let us reduce with a max
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer max = stream.reduce(0, (age1, age2) -> age1 > age2 ? age1 : age2) ;
List<Integer> ages = Arrays.asList(-1, -2) ; Stream<Integer> stream = ages.stream() ; > max = 0
![Page 141: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/141.jpg)
@JosePaumard #J8Stream
Example of max
The reduction with a max has a problem : why?
![Page 142: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/142.jpg)
@JosePaumard #J8Stream
Example of max
The reduction with a max has a problem : why?
Answer: the max reduction has no identity element, thus no default value
![Page 143: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/143.jpg)
@JosePaumard #J8Stream
Example of max
The reduction with a max has a problem : why?
Answer: the max reduction has no identity element, thus no default value
Solution: introduce the notion of Optional
![Page 144: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/144.jpg)
@JosePaumard #J8Stream
Method max()
Optional is the return type of the max() method
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Optional<Integer> max = stream.max(Comparator.naturalOrder()) ;
![Page 145: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/145.jpg)
@JosePaumard #J8Stream
Optional
An Optional is a wrapping type, that can be empty
How can I use it?
Optional<String> opt = ... ; if (opt.isPresent()) { String s = opt.get() ; } else { ... }
![Page 146: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/146.jpg)
@JosePaumard #J8Stream
Optional
An Optional is a wrapping type, that can be empty
How can I use it?
String s = opt.orElse("") ; // this is a default value that // is valid for our application
Optional<String> opt = ... ; if (opt.isPresent()) { String s = opt.get() ; } else { ... }
![Page 147: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/147.jpg)
@JosePaumard #J8Stream
Optional
An Optional is a wrapping type, that can be empty
How can I use it?
String s = opt.orElseThrow(MyException::new) ; // lazy initialization
![Page 148: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/148.jpg)
@JosePaumard #J8Stream
Optional can be built
One can explicitly build optionals
Optional<String> opt = Optional.<String>empty() ;
Optional<String> opt = Optional.of("one") ; // not null
Optional<String> opt = Optional.ofNullable(s) ; // may be null
![Page 149: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/149.jpg)
@JosePaumard #J8Stream
Optional: more patterns
An Optional can be seen as a special Stream with zero or one element
void ifPresent(Consumer<T> consumer) ;
![Page 150: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/150.jpg)
@JosePaumard #J8Stream
Optional: more patterns
An Optional can be seen as a special Stream with zero or one element
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
![Page 151: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/151.jpg)
@JosePaumard #J8Stream
Optional: more patterns
An Optional can be seen as a special Stream with zero or one element
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
![Page 152: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/152.jpg)
@JosePaumard #J8Stream
Optional: more patterns
An Optional can be seen as a special Stream with zero or one element
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
Optional<U> flatMap(Function<T, Optional<U>> mapper) ;
![Page 153: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/153.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
public class NewMath { public static Optional<Double> inv(Double d) { return d == 0.0d ? Optional.empty() : Optional.of(1/d) ; } public static Optional<Double> sqrt(Double d) { return d < 0.0d ? Optional.empty() : Optional.of(Math.sqrt(d)) ; } }
![Page 154: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/154.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.forEach( d1 -> NewMath.inv(d1) // Optional<Double> .flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double> .ifPresent(result::add) ) ;
doubles : [-1.0, 0.0, 1.0] result : [1.0]
![Page 155: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/155.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.forEach( d1 -> NewMath.inv(d1) // Optional<Double> .flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double> .ifPresent(result::add) ) ;
doubles : [-1.0, 0.0, 1.0] result : [1.0]
![Page 156: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/156.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
Function<Double, Optional<Double>> f = d -> NewMath.inv(d) // Optional<Double> .flatMap(d -> NewMath.sqrt(d))// Optional<Double>
![Page 157: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/157.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
Function<Double, Optional<Double>> f = d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt); // Optional<Double>
![Page 158: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/158.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>>
![Page 159: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/159.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double>
![Page 160: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/160.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
Function<Double, Stream<Double>> f = d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) ; // Stream<Double>
![Page 161: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/161.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.stream() .flatMap( d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double> ) // Stream<Double>
![Page 162: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/162.jpg)
@JosePaumard #J8Stream
Optional: new patterns sighted!
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.stream() .flatMap( d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double> ) // Stream<Double> .collect(Collectors.toList()) ;
![Page 163: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/163.jpg)
@JosePaumard #J8Stream
Back on the reduce() method
Two return types:
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, (age1, age2) -> age1 + age2) ;
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Optional<Integer> opt = stream.reduce((age1, age2) -> age1 + age2) ;
![Page 164: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/164.jpg)
@JosePaumard #J8Stream
Back on the reduce() method
Two return types:
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Integer sum = stream.reduce(0, Integer::sum) ;
List<Integer> ages = ... ; Stream<Integer> stream = ages.stream() ; Optional<Integer> opt = stream.reduce(Integer::sum) ;
![Page 165: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/165.jpg)
@JosePaumard #J8Stream
More on the reduction
A reduction never returns a Stream
- max(), min() [optionals]
- count()
Boolean reductions:
- allMatch(), noneMatch, anyMatch()
Return optionals:
- findFirst(), findAny() (parallel!)
![Page 166: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/166.jpg)
@JosePaumard #J8Stream
Note on the reduction
A reduction never returns a Stream
So it is not a lazy step / intermediate operation
A reduction always triggers the computation
They are terminal operations
![Page 167: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/167.jpg)
@JosePaumard #J8Stream
Terminal operation
Example
List<Person> persons = ... ; ... = persons.map(person -> person.getAge()) // Stream<Integer> .filter(age -> age > 20) // Stream<Integer> .min(Comparator.naturalOrder()) ;
![Page 168: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/168.jpg)
@JosePaumard #J8Stream
Terminal operation
Example
List<Person> persons = ... ; ... = persons.map(Person::getAge) // Stream<Integer> .filter(age -> age > 20) // Stream<Integer> .min(Comparator.naturalOrder()) ;
![Page 169: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/169.jpg)
@JosePaumard #J8Stream
Terminal operation
Let us write a full map / filter / reduce
List<Person> persons = ... ; Optional<Integer> age = persons.map(person -> person.getAge()) // Stream<Integer> .filter(age -> age > 20) // Stream<Integer> .min(Comparator.naturalOrder()) ; // terminal operation
![Page 170: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/170.jpg)
@JosePaumard #J8Stream
Terminal operation
Let us write a full map / filter / reduce
List<Person> persons = ... ; boolean b = persons.map(person -> person.getLastName()) .allMatch(length < 20) ; // terminal operation
![Page 171: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/171.jpg)
@JosePaumard #J8Stream
Terminal operation
Let us write a full map / filter / reduce
List<Person> persons = ... ; boolean b = persons.map(Person::getAge) .allMatch(length < 20) ; // terminal operation
![Page 172: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/172.jpg)
@JosePaumard #J8Stream
Terminal operation
Let us write a full map / filter / reduce
Much more efficient to compute this in one pass over the data: « short cutting methods »
List<Person> persons = ... ; boolean b = persons.map(Person::getAge) .allMatch(length < 20) ; // terminal operation
![Page 173: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/173.jpg)
@JosePaumard #J8Stream
What is a Stream?
An object on which we can define operations on data
No a priori limit on the size of the data
Typical operations: map / filter / reduce
![Page 174: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/174.jpg)
@JosePaumard #J8Stream
What is a Stream?
Pipeline approach:
1) we define the operations
2) we trigger the computations by calling a terminal operation
![Page 175: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/175.jpg)
@JosePaumard #J8Stream
What is a Stream?
And bytheway:
We can only have one terminal operation for a Stream
In case, another Stream must be built
![Page 176: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/176.jpg)
@JosePaumard #J8Stream
How one can build a Stream?
Let us have a look at the stream() default method
List<Person> persons = new ArrayList<>() ; Stream<Person> stream = persons.stream() ;
// Collection interface default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }
![Page 177: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/177.jpg)
@JosePaumard #J8Stream
How one can build a Stream?
Let us have a look at the stream() default method
// StreamSupport class public static <T> Stream<T> stream( Spliterator<T> spliterator, boolean parallel) { Objects.requireNonNull(spliterator) ; return new ReferencePipeline.Head<>( spliterator, StreamOpFlag.fromCharacteristics(spliterator),
parallel) ; }
![Page 178: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/178.jpg)
@JosePaumard #J8Stream
How one can build a Stream?
The spliterator() is defined in ArrayList
// ArrayList class @Override public Spliterator<E> spliterator() { return new ArrayListSpliterator<>(this, 0, -1, 0); }
![Page 179: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/179.jpg)
@JosePaumard #J8Stream
How one can build a Stream?
The spliterator() is defined in ArrayList
The Spliterator defines how to access the data
ArrayList: it reads the array
// ArrayList class @Override public Spliterator<E> spliterator() { return new ArrayListSpliterator<>(this, 0, -1, 0); }
![Page 180: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/180.jpg)
@JosePaumard #J8Stream
Spliterator
Let us see the method we need to implement
Consumes the next element, if it exists
// Spliterator interface boolean tryAdvance(Consumer<? super T> action);
![Page 181: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/181.jpg)
@JosePaumard #J8Stream
Spliterator
Let us see the method we need to implement
Consumes the next element, if it exists
A Stream does not assume that all the elements are available at build time
// Spliterator interface boolean tryAdvance(Consumer<? super T> action);
![Page 182: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/182.jpg)
@JosePaumard #J8Stream
Spliterator
Let us see the method we need to implement
Used in parallel computations: tries to split the data in two (fork / join)
// Spliterator interface Spliterator<T> trySplit();
![Page 183: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/183.jpg)
@JosePaumard #J8Stream
Spliterator
Let us see the method we need to implement
Returns an estimation of the size of this stream
// Spliterator interface long estimateSize();
![Page 184: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/184.jpg)
@JosePaumard #J8Stream
Spliterator
And there are also default methods
// Spliterator interface default void forEachRemaining(Consumer<? super T> action) { do { } while (tryAdvance(action)); }
// Spliterator interface default long getExactSizeIfKnown() { return (characteristics() & SIZED) == 0 ? -1L : estimateSize(); }
![Page 185: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/185.jpg)
@JosePaumard #J8Stream
Spliterator
And there is a last method:
Implémentation for ArrayList
// interface Spliterator int characteristics();
// pour ArrayList public int characteristics() { return Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED; }
![Page 186: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/186.jpg)
@JosePaumard #J8Stream
Spliterator
And there is a last method:
Implémentation for HashSet
// interface Spliterator int characteristics();
// pour HashSet public int characteristics() { return (fence < 0 || est == map.size ? Spliterator.SIZED : 0) | Spliterator.DISTINCT; }
![Page 187: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/187.jpg)
@JosePaumard #J8Stream
Characteristics of a Stream
Bits defined in the characteristics word Characteristic
ORDERED The order matters
DISTINCT No duplication
SORTED Sorted
SIZED The size is known
NONNULL No null values
IMMUTABLE Immutable
CONCURRENT Parallelism is possible
SUBSIZED The size is known
![Page 188: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/188.jpg)
@JosePaumard #J8Stream
Characteristics of a Stream
Some operations will switch some bits Method Set to 0 Set to 1
filter() SIZED -
map() DISTINCT, SORTED -
flatMap() DISTINCT, SORTED, SIZED -
sorted() - SORTED, ORDERED
distinct() - DISTINCT
limit() SIZED -
peek() - -
unordered() ORDERED -
![Page 189: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/189.jpg)
@JosePaumard #J8Stream
Characteristics of a Stream
Characteristics are taken into account when computing a result
// HashSet HashSet<String> strings = ... ; strings.stream() .distinct() // no processing is triggered .sorted() .collect(Collectors.toList()) ;
![Page 190: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/190.jpg)
@JosePaumard #J8Stream
Characteristics of a Stream
Characteristics are taken into account when computing a result
// SortedSet TreeSet<String> strings = ... ; strings.stream() .distinct() .sorted() // no processing is triggered .collect(Collectors.toList()) ;
![Page 191: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/191.jpg)
@JosePaumard #J8Stream
Stream implementation
Complex!
Two parts:
1) algorithms are in ReferencePipeline
2) data access: Spliterator, can be overriden
![Page 192: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/192.jpg)
@JosePaumard #J8Stream
A few words on Comparator
We wrote:
// Comparator interface Comparator cmp = Comparator.naturalOrder() ;
![Page 193: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/193.jpg)
@JosePaumard #J8Stream
A few words on Comparator
We wrote:
// Comparator interface Comparator cmp = Comparator.naturalOrder() ;
// Comparator interface @SuppressWarnings("unchecked") public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; }
![Page 194: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/194.jpg)
@JosePaumard #J8Stream
A few words on Comparator
// Comparators class enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; }
![Page 195: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/195.jpg)
@JosePaumard #J8Stream
A few words on Comparator
// Comparators class enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; }
public class MySingleton { INSTANCE; private MySingleton() {} public static MySingleton getInstance() { // some buggy double-checked locking code return INSTANCE; } }
![Page 196: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/196.jpg)
@JosePaumard #J8Stream
A few words on Comparator
// Comparators class enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; public int compare(Comparable<Object> c1, Comparable<Object> c2) { return c1.compareTo(c2); } public Comparator<Comparable<Object>> reversed() { return Comparator.reverseOrder(); } }
![Page 197: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/197.jpg)
@JosePaumard #J8Stream
A few words on Comparator
So we can write:
// Comparator interface Comparator<Person> cmp = Comparator.comparing(Person::getLastName) .thenComparing(Person::getFirstName) .thenComparing(Person::getAge) ;
![Page 198: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/198.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method comparing()
// Comparator interface public static <T, U> Comparator<T> comparing(Function<T, U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); }
![Page 199: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/199.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method comparing()
// Comparator interface public static <T, U extends Comparable<U>> Comparator<T> comparing(Function<T, U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator<T>) (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); }
![Page 200: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/200.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method comparing()
// Comparator interface public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator<T> & Serializable) (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); }
![Page 201: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/201.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method thenComparing()
// Comparator interface default <U> Comparator<T> thenComparing(Function<T, U> keyExtractor) { return thenComparing(comparing(keyExtractor)); }
![Page 202: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/202.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method thenComparing()
// Comparator interface default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor) { return thenComparing(comparing(keyExtractor)); }
![Page 203: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/203.jpg)
@JosePaumard #J8Stream
A few words on Comparator
Method thenComparing()
// Comparator interface default Comparator<T> thenComparing(Comparator<? super T> other) { Objects.requireNonNull(other); return (Comparator<T> & Serializable) (c1, c2) -> { int res = compare(c1, c2); return (res != 0) ? res : other.compare(c1, c2); }; }
![Page 204: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/204.jpg)
@JosePaumard #J8Stream
What do we have so far?
API Stream
- intermediate operations
- terminal operations
- implementation built on 2 classes
![Page 205: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/205.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
… selects the 1000 first people of the list
ArrayList<Person> persons = ... ; Stream<Persons> stream = persons.limit(1_000) ;
![Page 206: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/206.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
… selects the 1000 first people of the list
This operations needs a counter
How will it work in parallel?
ArrayList<Person> persons = ... ; Stream<Persons> stream = persons.limit(1_000) ;
![Page 207: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/207.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
ArrayList<Person> persons = ... ; List<String> names = persons.map(Person::getLastName) .collect(Collectors.toList()) ;
![Page 208: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/208.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
« the order of the names is the same as the order of the people »
ArrayList<Person> persons = ... ; List<String> names = persons.map(Person::getLastName) .collect(Collectors.toList()) ;
![Page 209: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/209.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
« the order of the names is the same as the order of the people »
How will it behave in parallel?
ArrayList<Person> persons = ... ; List<String> names = persons.map(Person::getLastName) .collect(Collectors.toList()) ;
![Page 210: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/210.jpg)
@JosePaumard #J8Stream
Stateless / stateful operations
This code:
« the order of the names is the same as the order of the people »
We should relax this constraint!
ArrayList<Person> persons = ... ; List<String> names = persons.map(Person::getLastName) .unordered() .collect(Collectors.toList()) ;
![Page 211: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/211.jpg)
@JosePaumard #J8Stream
Wrap-up on Stream
One can define operations on a Stream:
- intermediate & terminal
- stateless & stateful
A Stream can be processed in parallel
A Stream has a state, used to optimize computations
![Page 212: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/212.jpg)
@JosePaumard #J8Stream
Stream & performance
Two elements:
- lazy processing, on one pass over the data
- parallel processing
![Page 213: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/213.jpg)
@JosePaumard #J8Stream
Stream & performance
Two elements:
- lazy processing, on one pass over the data
- parallel processing
Stream<T> versus IntStream, LongStream, DoubleStream
![Page 214: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/214.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again:
ArrayList<Person> persons = ... ; persons.stream() .map(Person::getAge) .filter(age -> age > 20) .sum() ;
![Page 215: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/215.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again:
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) .filter(age -> age > 20) .sum() ;
![Page 216: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/216.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again:
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) // Stream<Integer> boxing .filter(age -> age > 20) .sum() ;
![Page 217: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/217.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again:
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) // Stream<Integer> boxing .filter(age -> age > 20) // Stream<Integer> re-boxing re- .sum() ;
![Page 218: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/218.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again:
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) // Stream<Integer> boxing .filter(age -> age > 20) // Stream<Integer> re-boxing re- .sum() ; // no such sum() method on Stream<T>
![Page 219: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/219.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) // Stream<Integer> boxing .filter(age -> age > 20) // Stream<Integer> re-boxing re- .mapToInt(age -> age.getValue()) // IntStream .sum() ;
![Page 220: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/220.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .map(Person::getAge) // Stream<Integer> boxing .filter(age -> age > 20) // Stream<Integer> re-boxing re- .mapToInt(Integer::getValue) // IntStream .sum() ;
![Page 221: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/221.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .sum() ;
![Page 222: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/222.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; int sum = persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .sum() ;
![Page 223: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/223.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; ??? = persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .max() ;
![Page 224: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/224.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; OptionalInt opt = persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .max() ;
![Page 225: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/225.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; ??? = persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .average() ;
![Page 226: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/226.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
ArrayList<Person> persons = ... ; OptionalInt opt = persons.stream() // Stream<Person> .mapToInt(Person::getAge) // IntStream .filter(age -> age > 20) // IntStream // .mapToInt(Integer::getValue) .average() ;
![Page 227: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/227.jpg)
@JosePaumard #J8Stream
Stream & performance
Let see this example again
sur l’exemple
In one pass we have: count, sum, min, max, average
ArrayList<Person> persons = ... ; IntSummaryStatistics stats = persons.stream() .mapToInt(Person::getAge) .filter(age -> age > 20) .summaryStatistics() ;
![Page 228: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/228.jpg)
@JosePaumard #J8Stream
Parallel streams
How to build a parallel Stream?
Built on top of fork / join
ArrayList<Person> persons = ... ; Stream<Person> stream1 = persons.parallelStream() ; Stream<Person> stream2 = persons.stream().parallel() ;
![Page 229: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/229.jpg)
@JosePaumard #J8Stream
Parallel streams
By default, a parallel streams uses the default « fork join common pool », defined at the JVM level
The same pool is shared by all the streams
![Page 230: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/230.jpg)
@JosePaumard #J8Stream
Parallelism
By default, a parallel streams uses the default « fork join common pool », defined at the JVM level
By default, the parallelism level is the # of cores
We can set it with a sytem property:
System.setProperty( "java.util.concurrent.ForkJoinPool.common.parallelism", 2) ;
![Page 231: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/231.jpg)
@JosePaumard #J8Stream
Parallelism
We can also decide the FJ pool for a given Stream
List<Person> persons = ... ; ForkJoinPool fjp = new ForkJoinPool(2) ; fjp.submit( () -> // persons.stream().parallel() // this is an implementation .mapToInt(p -> p.getAge()) // of Callable<Integer> .filter(age -> age > 20) // .average() // ).get() ;
![Page 232: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/232.jpg)
@JosePaumard #J8Stream
Reduction
A reduction can be seen as a SQL agregation (sum, min, max, avg, etc…)
![Page 233: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/233.jpg)
@JosePaumard #J8Stream
Reduction
A reduction can be seen as a SQL agregation (sum, min, max, avg, etc…)
But it can be seen in a more general sense
![Page 234: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/234.jpg)
@JosePaumard #J8Stream
Reduction
Example: sum()
![Page 235: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/235.jpg)
@JosePaumard #J8Stream
Reduction
Example: sum()
The result is an integer, its initial value being 0
![Page 236: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/236.jpg)
@JosePaumard #J8Stream
Reduction
Example: sum()
The result is an integer, its initial value being 0
Adding an element to the result is… adding
![Page 237: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/237.jpg)
@JosePaumard #J8Stream
Reduction
Example: sum()
The result is an integer, its initial value being 0
Adding an element to the result is… adding
Combining two partial results (think parallel) is also « adding »
![Page 238: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/238.jpg)
@JosePaumard #J8Stream
Reduction
So we have 3 operations:
![Page 239: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/239.jpg)
@JosePaumard #J8Stream
Reduction
So we have 3 operations:
- the definition of a container, which holds the result
![Page 240: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/240.jpg)
@JosePaumard #J8Stream
Reduction
So we have 3 operations:
- the definition of a container, which holds the result
- adding an element to that container
![Page 241: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/241.jpg)
@JosePaumard #J8Stream
Reduction
So we have 3 operations:
- the definition of a container, which holds the result
- adding an element to that container
- combining two partialy filled containers
![Page 242: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/242.jpg)
@JosePaumard #J8Stream
Reduction
So we have 3 operations:
- the definition of a container, which holds the result
- adding an element to that container
- combining two partialy filled containers
This is a much more broader vision than just an agregation
![Page 243: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/243.jpg)
@JosePaumard #J8Stream
Reduction
So a reduction is based on 3 operations:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
![Page 244: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/244.jpg)
@JosePaumard #J8Stream
Reduction
So a reduction is based on 3 operations:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
() -> new StringBuffer() ;
![Page 245: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/245.jpg)
@JosePaumard #J8Stream
Reduction
So a reduction is based on 3 operations:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
() -> new StringBuffer() ;
(StringBuffer sb, String s) -> sb.append(s) ;
![Page 246: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/246.jpg)
@JosePaumard #J8Stream
Reduction
So a reduction is based on 3 operations:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
() -> new StringBuffer() ;
(StringBuffer sb, String s) -> sb.append(s) ;
(StringBuffer sb1, StringBuffer sb2) -> sb1.append(sb2) ;
![Page 247: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/247.jpg)
@JosePaumard #J8Stream
Reduction
So a reduction is based on 3 operations:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
StringBuffer::new ;
StringBuffer::append ;
StringBuffer::append ;
![Page 248: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/248.jpg)
@JosePaumard #J8Stream
Reduction: implementation
Example 1: reducing in a StringBuffer
List<Person> persons = ... ; StringBuffer result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( StringBuffer::new, // constructor StringBuffer::append, // accumulator StringBuffer::append // combiner ) ;
![Page 249: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/249.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Example 1: using a Collectors
List<Person> persons = ... ; String result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.joining() ) ;
![Page 250: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/250.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Collecting in a String
List<Person> persons = ... ; String result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.joining(", ") ) ;
![Page 251: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/251.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Collecting in a String
List<Person> persons = ... ; String result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.joining(", ", "{", "}") ) ;
![Page 252: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/252.jpg)
@JosePaumard #J8Stream
Reduction
Example 2:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
() -> new ArrayList() ;
(list, element) -> list.add(element) ;
(list1, list2) -> list1.addAll(list2) ;
![Page 253: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/253.jpg)
@JosePaumard #J8Stream
Reduction
Example 2:
- a constructor: Supplier
- an accumulator: Function
- a combiner: Function
ArrayList::new ;
Collection::add ;
Collection::allAll ;
![Page 254: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/254.jpg)
@JosePaumard #J8Stream
Reduction: implementation
Example 2: reduction in a List
List<Person> persons = ... ; ArrayList<String> names = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( ArrayList::new, // constructor Collection::add, // accumulator Collection::addAll // combiner ) ;
![Page 255: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/255.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Example 2: reduction in a List
List<Person> persons = ... ; List<String> result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.toList() ) ;
![Page 256: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/256.jpg)
@JosePaumard #J8Stream
Reduction: implementation
Example 3: reduction in a Set
List<Person> persons = ... ; HashSet<String> names = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( HashSet::new, // constructor Collection::add, // accumulator Collection::addAll // combiner ) ;
![Page 257: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/257.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Example 3: reduction in a Set
List<Person> persons = ... ; Set<String> result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.toSet() ) ;
![Page 258: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/258.jpg)
@JosePaumard #J8Stream
Reduction: collectors
Example 4: reduction in a given collection
List<Person> persons = ... ; TreeSet<String> result = persons.stream() .filter(person -> person.getAge() > 20) .map(Person::getLastName) .collect( Collectors.toCollection(TreeSet::new) ) ;
![Page 259: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/259.jpg)
@JosePaumard #J8Stream
Collectors
Collectors class: 33 static methods
An amazing toolbox!
![Page 260: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/260.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: age / list of the people
Map<Integer, List<Person>> result = persons.stream() .collect( Collectors.groupingBy(Person::getAge) ) ;
![Page 261: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/261.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: age / # of people
Map<Integer, Long> result = persons.stream() .collect( Collectors.groupingBy( Person::getAge, Collectors.counting() // « downstream collector » ) ) ;
![Page 262: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/262.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: age / list of the names
Map<Integer, List<String>> result = persons.stream() .collect( Collectors.groupingBy( Person::getAge, Collectors.mapping( // Person::getLastName // downstream collector ) // ) ) ;
![Page 263: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/263.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: age / names joined in a single String
Map<Integer, String> result = persons.stream() .collect( Collectors.groupingBy( Person::getAge, Collectors.mapping( // 1st downstream collector Person::getLastName Collectors.joining(", ") // 2nd downstream collector ) ) ) ;
![Page 264: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/264.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: age / names sorted alphabetically
Map<Integer, TreeSet<String>> result = persons.stream() .collect( Collectors.groupingBy( Person::getAge, Collectors.mapping( Person::getLastName Collectors.toCollection(TreeSet::new) ) ) ) ;
![Page 265: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/265.jpg)
@JosePaumard #J8Stream
Collectors: groupingBy
HashMap: the same, sorted by age
TreeMap<Integer, TreeSet<String>> result = persons.stream() .collect( Collectors.groupingBy( Person::getAge, TreeMap::new, Collectors.mapping( Person::getLastName Collectors.toCollection(TreeSet::new) ) ) ) ;
![Page 266: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/266.jpg)
@JosePaumard #J8Stream
Wrap-up
Stream + Collectors =
New tools for data processing (map / filter / reduce)
1) lazy execution
2) parallelism
Live coding to come!
![Page 267: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/267.jpg)
@JosePaumard #J8Stream
Wrap-up
More to come:
- use cases
- live coding!
![Page 268: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/268.jpg)
@JosePaumard
Coffee time !
#Stream8
![Page 269: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/269.jpg)
Java 8 Streams & Collectors Patterns, performance, parallelization
@JosePaumard
![Page 270: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/270.jpg)
Questions ?
#J8Stream
@JosePaumard
![Page 271: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/271.jpg)
« movies and actors »
https://github.com/JosePaumard/jdk8-lambda-tour
http://introcs.cs.princeton.edu/java/data/
![Page 272: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/272.jpg)
@JosePaumard #J8Stream
Movies and actors
File: « movies-mpaa.txt »
With 14k movies from 1916 to 2004
With:
- the title of the movie
- the release year
- the list of the actors (170k)
![Page 273: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/273.jpg)
@JosePaumard #J8Stream
Greatest release year
1st question: which year saw the most movies?
![Page 274: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/274.jpg)
@JosePaumard #J8Stream
Greatest release year
1st question: which year saw the most movies?
1st step: we can build a hashmap
- the keys are the release year
- the values the # of movies in that year
![Page 275: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/275.jpg)
@JosePaumard #J8Stream
Greatest release year
1st question: which year saw the most movies?
1st step: we can build a hashmap
- the keys are the release year
- the values the # of movies in that year
2nd step: get the key value pair with the greatest value
![Page 276: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/276.jpg)
@JosePaumard #J8Stream
Greatest release year
Live coding
![Page 277: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/277.jpg)
@JosePaumard #J8Stream
Greatest release year
1st question: which year saw the most movies?
Solution: map / reduce
![Page 278: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/278.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
![Page 279: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/279.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Once again, we can build a hashmap:
- the keys are the actors
- the values are the # of movies
![Page 280: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/280.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Let us build the set of all the actors
Set<Actor> actors = movies.stream() .flatMap(movie -> movie.actors().stream()) .collect(Collector.toSet()) ;
![Page 281: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/281.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream() .collect( ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 282: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/282.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream() .collect( Collectors.toMap( ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 283: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/283.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream() .collect( Collectors.toMap( actor -> actor, ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 284: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/284.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream() .collect( Collectors.toMap( Function.identity(), ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 285: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/285.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream() .collect( Collectors.toMap( Function.identity(), actor -> movies.stream() .filter(movie -> movie.actors().contains(actor)) .count() ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 286: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/286.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream().parallel() // T = 40s .collect( Collectors.toMap( Function.identity(), actor -> movies.stream() .filter(movie -> movie.actors().contains(actor)) .count() ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 287: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/287.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
actors.stream().parallel() // 170k .collect( Collectors.toMap( Function.identity(), actor -> movies.stream() // 14k 2,4G!! .filter(movie -> movie.actors().contains(actor)) .count() ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 288: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/288.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Set<Actor> actors = movies.stream() .flatMap(movie -> movie.actors().stream()) // stream of actors .collect(Collector.toSet()) ;
![Page 289: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/289.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
And in this stream, if an actor played in 2 movies, she appears twice
Set<Actor> actors = movies.stream() .flatMap(movie -> movie.actors().stream()) // stream of actors .collect(Collector.toSet()) ;
![Page 290: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/290.jpg)
@JosePaumard #J8Stream
Most seen actor
Live coding
![Page 291: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/291.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Answer: Frank Welker
![Page 292: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/292.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Answer: Frank Welker
… and in fact he’s not really the most « seen » actor
![Page 293: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/293.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen actor?
Answer: Frank Welker
![Page 294: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/294.jpg)
@JosePaumard #J8Stream
Most seen actor
2nd question: most seen heard actor?
Answer: Frank Welker
![Page 295: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/295.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
![Page 296: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/296.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
So it is a hashmap in which:
- the keys are the actors
- the values are other hashmaps
![Page 297: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/297.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
So it is a hashmap in which:
- the keys are the actors
- the values are other hashmaps - in which keys are the release years
- and the values the # of movies → AtomicLong
![Page 298: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/298.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
movies.stream() .flatMap(movie -> movie.actors().stream()) .collect( Collectors.groupingBy( // build a Map<year, ...> movie -> movie.releaserYear(), // build a Map<Actor, # of movies> ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 299: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/299.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
movies.stream() .flatMap(movie -> movie.actors().stream()) .collect( Collectors.groupingBy( // build a Map<year, ...> movie -> movie.releaserYear(), // build a Map<Actor, # of movies> -> custom DS Collector ) ) .entrySet().stream() .max(Map.Entry.comparingByValue()).get() ;
![Page 300: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/300.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
So it is a hashmap in which:
- the keys are the actors
- the values are other hashmaps - in which keys are the release years
- and the values the # of movies → AtomicLong
And we want the max by the # of movies
![Page 301: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/301.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
We need 3 things to build a collector
- a constructor for the resulting container
- an accumulator to add an element to the container
- a combiner that merges two partially filled containers
![Page 302: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/302.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
Live coding
![Page 303: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/303.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
![Page 304: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/304.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
Answer: Phil Hawn, in 1999 played in 24 movies
![Page 305: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/305.jpg)
@JosePaumard #J8Stream
Most seen actor in a year
3rd question: most seen actor in a given year?
Answer: Phil Hawn, in 1999 played in 24 movies
![Page 306: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/306.jpg)
« Shakespeare plays Scrabble »
https://github.com/JosePaumard/jdk8-lambda-tour
http://introcs.cs.princeton.edu/java/data/
![Page 307: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/307.jpg)
@JosePaumard #J8Stream
Scrabble
Two files:
- OSPD = official personnal Scrabble dictionary
- The words used by Shakespeare
![Page 308: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/308.jpg)
@JosePaumard #J8Stream
Scrabble
Two files:
- OSPD = official personnal Scrabble dictionary
- The words used by Shakespeare
- And some documentation (Wikipedia)
private static final int [] scrabbleENScore = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10} ;
![Page 309: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/309.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
H E L L O 4 1 1 1 1 // from the scrabbleENScore array
![Page 310: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/310.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
H E L L O 4 1 1 1 1 // from the scrabbleENScore array SUM = 8
![Page 311: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/311.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
H E L L O // this is a stream of the letters of the word HELLO 4 1 1 1 1 SUM = 8
![Page 312: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/312.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
H E L L O // this is a stream of the letters of the word HELLO 4 1 1 1 1 // mapping : letter -> score of the letter SUM = 8
![Page 313: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/313.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
H E L L O // this is a stream of the letters of the word HELLO 4 1 1 1 1 // mapping : letter -> score of the letter SUM // reduction : sum = 8
![Page 314: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/314.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
Live coding
![Page 315: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/315.jpg)
@JosePaumard #J8Stream
Scrabble: score of a word
1st question: how to compute the score of a word
= map / reduce
![Page 316: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/316.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
2nd question: compute the best word of Shakespeare
![Page 317: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/317.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
2nd question: compute the best word of Shakespeare
1) Histogram: score of the words / list of the words
![Page 318: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/318.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
2nd question: compute the best word of Shakespeare
1) Histogram: score of the words / list of the words
2) Max by key value
![Page 319: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/319.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
2nd question: compute the best word of Shakespeare
1) Histogram: score of the words / list of the words HashMap, Collectors.groupingBy()
2) Max by key value
![Page 320: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/320.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
2nd question: compute the best word of Shakespeare
1) Histogram: score of the words / list of the words HashMap, Collectors.groupingBy()
2) Max by key value
Shouldnt be too hard
![Page 321: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/321.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
Live coding
![Page 322: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/322.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
3rd question: filter out the wrong words
We need to add a filtering step
![Page 323: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/323.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
Live coding
![Page 324: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/324.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
3rd question: filter out the wrong words
Solution: map / filter / reduce
![Page 325: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/325.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
Question: can one really write this word?
![Page 326: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/326.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
Question: can one really write this word?
private static final int [] scrabbleENDistribution = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 9, 2, 2, 1, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1} ;
![Page 327: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/327.jpg)
@JosePaumard #J8Stream
Scrabble: score of Shakespeare
Answer: no…
private static final int [] scrabbleENDistribution = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 9, 2, 2, 1, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1} ;
![Page 328: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/328.jpg)
@JosePaumard #J8Stream
Filtering V2
4th question: how to check if I have the available letters?
private static final int [] scrabbleENDistribution = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 9, 2, 2, 1, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1} ;
![Page 329: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/329.jpg)
@JosePaumard #J8Stream
Filtering V2
4th question: how to check if I have the available letters?
1 1 2 2 1 1 needed letters
![Page 330: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/330.jpg)
@JosePaumard #J8Stream
Filtering V2
4th question: how to check if I have the available letters?
1 1 2 2 1 1
1 4 9 1 6 3
needed letters
available letters
![Page 331: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/331.jpg)
@JosePaumard #J8Stream
Filtering V2
4th question: how to check if I have the available letters?
I need a allMatch() reducer!
1 1 2 2 1 1
1 4 9 1 6 3
needed letters
available letters
![Page 332: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/332.jpg)
@JosePaumard #J8Stream
Filtering V2
Live coding
![Page 333: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/333.jpg)
@JosePaumard #J8Stream
Filtering V2
4th question: how to check if I have the available letters?
Solution: map / filter / reduce
![Page 334: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/334.jpg)
![Page 335: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/335.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: and what about using blanks?
![Page 336: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/336.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: and what about using blanks?
private static final int [] scrabbleENDistribution = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 9, 2, 2, 1, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1} ;
![Page 337: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/337.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: and what about using blanks?
private static final int [] scrabbleENDistribution = { // a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z 9, 2, 2, 1, 12, 2, 3, 2, 9, 1, 1, 4, 2, 6, 8, 2, 1, 6, 4, 6, 4, 2, 2, 1, 2, 1} ;
![Page 338: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/338.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
It has 2 impacts:
- on the filtering of the words
- on the computation of the score
![Page 339: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/339.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: how to compute the score?
1 1 2 2 1 1
![Page 340: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/340.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: how to compute the score?
1 1 2 2 1 1
1 4 9 1 6 3
![Page 341: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/341.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: how to compute the score?
1 1 2 2 1 1
1 4 9 1 6 3
10 1 2 10 1 2 → 26
![Page 342: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/342.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
Live coding
![Page 343: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/343.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
5th question: how to compute the score?
Solution: map / filter / reduce
![Page 344: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/344.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
6th question: how many blanks do we need?
1 1 2 2 1 1
![Page 345: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/345.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
6th question: how many blanks do we need?
1 1 2 2 1 1
1 4 9 1 6 3
![Page 346: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/346.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
6th question: how many blanks do we need?
1 1 2 2 1 1
1 4 9 1 6 3
0 -3 -7 +1 -5 -2
![Page 347: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/347.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
6th question: how many blanks do we need?
1 1 2 2 1 1
1 4 9 1 6 3
0 0 0 +1 0 0 → 1
![Page 348: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/348.jpg)
@JosePaumard #J8Stream
Scrabble: use of blanks
Live coding
![Page 349: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/349.jpg)
@JosePaumard #J8Stream
Use of a blank
6th question: how many blanks do we need?
Solution: map / reduce
![Page 350: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/350.jpg)
![Page 351: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/351.jpg)
![Page 352: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/352.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
![Page 353: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/353.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
![Page 354: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/354.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
![Page 355: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/355.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
6 solutions to put the word:
- right square = 3 last letters
- left square= 3 first letters
![Page 356: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/356.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
6 solutions to put the word:
- right square = 3 last letters
- left square= 3 first letters
If the word is long enough (7 letters)!
![Page 357: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/357.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
So we need to take a max, on which set?
word.chars().skip(4) // 1st stream word.chars().limit(Integer.max(0, word.length() - 4)) // 2nd stream
![Page 358: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/358.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
IntStream.concat( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .map(scrabbleENScore) .max()
![Page 359: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/359.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
Problem: concat does not parallel well
IntStream.concat( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .map(scrabbleENScore) .max()
![Page 360: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/360.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
Stream.of( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) // returns a Stream of Stream!
![Page 361: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/361.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
Stream.of( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .flatMapToInt(Function.identity()) // chars() is an IntStream .map(scrabbleENScore) .max() // we have an IntStream!
![Page 362: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/362.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
What should we do with this Optional?
Stream.of( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .flatMapToInt(Function.identity()) // chars() is an IntStream .map(scrabbleENScore) .max() // we have an IntStream!
![Page 363: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/363.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
… that can be empty!
Stream.of( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .flatMapToInt(Function.identity()) // chars() is an IntStream .map(scrabbleENScore) .max() // we have an IntStream!
![Page 364: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/364.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: what about the Double letter score?
… that can be empty!
Stream.of( word.chars().skip(4), word.chars().limit(Integer.max(0, word.length() - 4)) ) .flatMapToInt(Function.identity()) // chars() is an IntStream .map(scrabbleENScore) .max() // we have an IntStream! .orElse(0) ;
![Page 365: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/365.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
Live coding
![Page 366: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/366.jpg)
@JosePaumard #J8Stream
Scrabble: and what about the board?
7th question: can we take the Double letter score?
Solution: map / reduce
![Page 367: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/367.jpg)
https://github.com/JosePaumard/jdk8-lambda-tour
![Page 368: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/368.jpg)
@JosePaumard #J8Stream
Conclusion
Streams + Collectors = no need to use the Iterator pattern any more
![Page 369: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/369.jpg)
@JosePaumard #J8Stream
Conclusion
Streams + Collectors = no need to use the Iterator pattern any more
Combined with lambdas = new way of writing data processing and applications in Java
![Page 370: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/370.jpg)
@JosePaumard #J8Stream
Conclusion
Streams + Collectors = no need to use the Iterator pattern any more
Combined with lambdas = new way of writing data processing in Java
- writing code
- architecture
![Page 371: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/371.jpg)
@JosePaumard #J8Stream
Conclusion
Some books:
![Page 372: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/372.jpg)
Thank you!
@JosePaumard
#Stream8
![Page 373: Java 8, Streams & Collectors, patterns, performances and parallelization](https://reader034.vdocuments.us/reader034/viewer/2022052412/5589da58d8b42a3a1d8b465f/html5/thumbnails/373.jpg)
@JosePaumard
#Stream8