Java-parallelStream

關於Java-stream parallel

stream是Java8中新增的一個特性,被統稱為流。
stream更像一個高階版本的 Iterator,而和Iterator不同的是,Stream 可以進行Concurrent操作。

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream()
.forEach(out::println);
-------------------------------
1
3
4
5
6
7
8
9
2

使用parallelStream()會進行Concurrent操作,得到結果的順序不會排序。

可以呼叫forEachOrdered(),可得到按照原來Stream的資料順序

1
2
3
4
5
6
7
8
9
10
11
12
13
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream()
.forEachOrdered(out::println);
-------------------------------
1
2
3
4
5
6
7
8
9

parallelStream 使用時機

1
2
3
4
5
6
7
8
9
10
11
如果你的原始數據結構是:

ArrayList、HashMap、HashSet、ConcurrentHashMap、Arrays、int和long的stream,這些適合使用parallelStream

原因是可以精準切割成任意大小的子程序 讓thread劃分工作變得簡單

操作上很大程度的影響了Concurrent的效能,如果你在操作做了很多工作 而且工作與工作間彼此依賴(比如說下一個操作依賴於上一個操作),這種情況不適合Concurrent

比較好的操作是reduce、min、max、count、sum、anyMatch、allMatch、noneMatch

比較不好的操作是collect