Professional Documents
Culture Documents
JAVA STREAMS
MARCH 2019
AGENDA
WHAT ARE STREAMS?
THE STRUCTURE OF STREAMS
2
TYPES OF STREAMS
OPERATIONS’ ORDER
COLLECTIONS VS STREAMS
2
WHAT ARE STREAMS?
3
AGENDA
WHAT ARE STREAMS?
THE STRUCTURE OF STREAMS
4
TYPES OF STREAMS
OPERATIONS’ ORDER
COLLECTIONS VS STREAMS
4
THE STRUCTURE OF STREAMS
5
STREAM SOURCES
6
STREAM SOURCES
7
TERMINAL OPERATIONS
Method Return type Example
allMatch(Predicate<T>)
Stream.iterate(1, n -> n+2)
noneMatch(Predicate<T>) boolean
.allMatch(i -> i%2 == 0);
anyMatch(Predicate<T>)
collect(...) R Stream.of(1,2,3).collect(Collectors.toList());
count() long Stream.of(“A”, “B”, “C”).count();
8
TERMINAL OPERATIONS
REDUCE
Terminal operation that is used for
combining a stream into a single result.
int sum = 0; 9
for (int x : numbers) {
sum += x;
}
9
TERMINAL OPERATIONS
REDUCE
Signatures:
• Optional<T> reduce(BinaryOperator<T> accumulator)
• T reduce(T identity, BinaryOperator<T> accumulator)
• <U> U reduce(U identity, BiFunction<U,? super
10 T,U> accumulator, BinaryOperator<U>
combiner)
Why does it return an Optional<Integer>? Consider the case when the stream contains
no elements. The reduce operation can’t return a sum because it doesn’t have an initial
value. This is why the result is wrapped in an Optional object to indicate that the sum
may be absent.
10
TERMINAL OPERATIONS
REDUCE
11
Optional<Integer> max = numbers.stream()
.reduce(Integer::max);
11
TERMINAL OPERATIONS
COLLECT
Terminal operation that is used for getting data out of a stream into another form
(e.g. List, Set, Map).
The collect operation accepts a Collector
12 as parameter, which can be a custom
collector, or an already defined collector from the java.util.stream.Collectors class.
12
TERMINAL OPERATIONS
COLLECT
13
13
TERMINAL OPERATIONS
COLLECT
<R,A> R collect(Collector<? super T, A,R> collector)
• List 14
14
TERMINAL OPERATIONS
COLLECT
<R,A> R collect(Collector<? super T, A,R> collector)
• Map 15
15
TERMINAL OPERATIONS
COLLECT
<R,A> R collect(Collector<? super T, A,R> collector)
• String 16
16
TERMINAL OPERATIONS
COLLECT
<R,A> R collect(Collector<? super T, A,R> collector)
It takes as parameters: 17
• a supplier: creates and returns a new container that will store the results
• an accumulator: adds a value to the container
• a combiner: merges two accumulators together in case of parallel processing
• a finisher: converts an accumulator to final result type
17
TERMINAL OPERATIONS
COLLECT
<R,A> R collect(Collector<? super T, A,R> collector)
18
18
TERMINAL OPERATIONS
COLLECT
Defining a custom collector using the collect method with the following
signature:
<R> R collect(Supplier<R> supplier,
BiConsumer<R,19? super T> accumulator,
BiConsumer<R, R> combiner)
19
INTERMEDIATE OPERATIONS
Intermediate operations return another stream as the return type. This allows the
operations to be connected to form a query.
20
20
INTERMEDIATE OPERATIONS
Method Return type Example
filter(Predicate<T>) Stream<T> persons.stream().filter(i -> i.getName().startsWith(‘A’));
distinct() Stream<T> Arrays.asList(1, 2, 1, 3, 3, 2, 4).stream().distinct();
limit(int) Stream<T> Stream.iterate(1, n -> n+2).limit(2);
skip(int) Stream<T> Stream.iterate(1, n -> n+2).skip(2);
21
persons.stream().map(Persons::getName()).sorted();
persons.stream().map(Persons::getName())
sorted()
Stream<T> .sorted(Comparator.naturalOrder());
sorted(Comparator<T>)
persons.stream()
.sorted(Comparator.comparing(Person::getName());
peek(Consumer<T>) Stream<T> persons.stream().peek(System.out::println);
map(Function<T,R>)
persons.stream().map(Persons::getName())
flatMap( Stream<R>
.map(String::length);
Function<T, Stream<R>>)
21
INTERMEDIATE OPERATIONS
MAP VS FLATMAP
22
AGENDA
WHAT ARE STREAMS?
THE STRUCTURE OF STREAMS
23
TYPES OF STREAMS
OPERATIONS’ ORDER
COLLECTIONS VS STREAMS
23
TYPES OF STREAMS
SEQUENTIAL VS PARALLEL STREAMS
Sequential streams
.stream() on collections
Parallel streams
.parallelStream() on collections 24
24
TYPES OF STREAMS
SEQUENTIAL VS PARALLEL STREAMS
25
Similarly, you can turn a parallel stream into a sequential one by invoking the method
sequential() on it.
25
TYPES OF STREAMS
PRIMITIVE STREAMS
The Stream API comes packed with special streams that work with the
primitive types: int, long, double.
IntStream
LongStream
26
DoubleStream
26
TYPES OF STREAMS
PRIMITIVE STREAMS
The Stream API comes packed with special streams that work with the
primitive types: int, long, double.
27
27
TYPES OF STREAMS
PRIMITIVE STREAMS
28
28
AGENDA
WHAT ARE STREAMS?
THE STRUCTURE OF STREAMS
29
TYPES OF STREAMS
OPERATIONS’ ORDER
COLLECTIONS VS STREAMS
29
OPERATIONS’ ORDER
30
This means, that if intermediate operations are not followed by a terminal one, they
won’t execute.
30
OPERATIONS’ ORDER
31
31
OPERATIONS’ ORDER
OPTIMIZE THE STREAM BY RE-ORDERING THE OPERATIONS
32
32
AGENDA
WHAT ARE STREAMS?
THE STRUCTURE OF STREAMS
34
TYPES OF STREAMS
OPERATIONS’ ORDER
COLLECTIONS VS STREAMS
34
COLLECTIONS VS STREAMS
Collections Streams
35
36