-
Notifications
You must be signed in to change notification settings - Fork 31
/
13s-fp2.html
163 lines (107 loc) · 4.52 KB
/
13s-fp2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
---
layout: presentation
title: "Advanced Stream Processing in Java"
permalink: /13s-fp2/
---
layout: true
<footer>
<span class="icon github">
<svg version="1.1" class="github-icon-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#C2C2C2" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
</svg>
</span>
<a href="https://github.com/sikoried"><span class="username">sikoried</span></a>
</footer>
---
# Reduction
Korbinian Riedhammer
---
# Advanced Stream Processing in Java
Korbinian Riedhammer
---
# Streams in Java
## Generation
- `Stream.of(...)` with array or varargs
- `Collection.stream()`, if supported
- `Stream.generate(...)` using a generator
- Popular APIs, e.g. `Pattern.compile("\\W").splitAsStream("hello world");`
## Intermediate Operations
## Terminal Operations
---
# Intermediate Operations
`filter(Predicate<T> p)` removes/skips unwanted elements in the stream.
`map(Function<T, R> f)` transforms a `Stream<T>` into a `Stream<R>` using the provided `Function`
`sorted(Comparator<T> comp)` returns a sorted stream
`concat(Stream<T> s)` appends another stream
`distinct()` removes duplicates
`skip(int n)` and `limit(int n)` skip elements and truncate the stream
`flatMap(...)` flattens a list-of-lists into a single stream
```java
Stream<List<Integer>> lol = Stream.of(
Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5)
);
Stream<Integer> integerStream = lol.flatMap(al -> al.stream());
integerStream.forEach(System.out::print); // 12345
```
---
# Terminal Operations
Use `.forEach(Consumer<T> c)` to pass each element to the `Consumer`
Use `reduce` to combine (and optionally map) elements of a stream.
```java
Stream.of(1, 3, 3, 7).reduce(0, Integer::sum));
// 14
Stream.of(1, 3, 3, 7).reduce(BigInteger.ZERO,
(bi, i) -> bi.add(BigInteger.valueOf(i)),
(bi1, bi2) -> bi1.add(bi2))); // combine identity with first result
// 14
```
Use `collect` to collect/distribute elements to other structures.
```java
List<Integer> list1 = new LinkedList<>();
Stream.of(1, 3, 3, 7).forEach(i -> list.add(i));
// or shorter, using collect
List<Integer> list2 = Stream.of(1, 3, 3, 7).collect(Collectors.toList()));
```
---
# Collectors
```java
// Accumulate names into a TreeSet
Set<String> set = people.stream()
.map(Person::getName)
.collect(Collectors.toCollection(TreeSet::new));
// Convert elements to strings and concatenate them, separated by commas
String joined = things.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));
// Compute sum of salaries of employee
int total = employees.stream()
.collect(Collectors.summingInt(Employee::getSalary));
// Group employees by department
Map<Department, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Compute sum of salaries by department
Map<Department, Integer> totalByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
// Partition students into passing and failing
Map<Boolean, List<Student>> passingFailing = students.stream()
.collect(Collectors.partitioningBy(s -> s.getGrade() <= 400));
```
---
## Finding Values in a Stream
Use `findFirst()`, `min()` or `max()` to find values, returns `Optional<T>`!
## Verifying Values in a Stream
Use the `allMatch()`, `anyMatch()` and `noneMatch()` functions with a `Predicate<T>`.
## Parallel Processing
Use `parallelStream()` for concurrent processing.
---
# Well Done!
.skip[
![fail](/assets/giphy-fail.gif)
]
---
# Well Done!
.skip.w55[
![win](/assets/giphy-win.gif)
]