關於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
|