Java 8對於集合(collections)的操作,新增了使用流(Stream)來進行操作。以Stream操作collection的方式稱為聚合操作(aggregate operations)。而其forEach方法與傳統的迭代(iteration)雖然都是用來走訪集合中的每一個元素,但差別如下:
以下是以Stream.forEach()
及Iterator
走訪List
集合的方式:
List<String> ss = Arrays.asList("john", "mary", "bill");
// Aggregation operation
ss.stream().forEach(s -> System.out.println(s));
// Iteration 1
Iterator<String> it = ss.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// Iteration 2
for (Iterator<String> itr = ss.iterator(); itr.hasNext();) {
System.out.println(itr.next());
}
Stream的forEach是內部迭代(Internal iteration),傳統的iteration是外部迭代(External iteration)
Internal iteration並沒有如傳統iteration有next()
用來指示走訪下一個元素的方法。Internal iteration由你的應用程式決定要被迭代的集合,但該如何走訪集合中的的每一個元素則是由JDK決定;而External iteration則是被迭代的集合及迭代的方式兩者皆由應用程式來決定。
而主要的差別是,External iteration只能以序列方式(serial)迭代集合,而Internal iteration除了可以序列方式,也支援以平行方式(parallel)來迭代集合。
也就是說Sream的forEach可以利用平行計算將迭代的程式拆分為多個子程式來平行處理,最後在將子程式的執行結果組合起來。其意味著Stream的forEach比原本的iteration更彈性且高效
Aggregate operations每一個元素是從stream取出,而iteration是由集合取出。
Aggregate operation並非直接處理集合中的元素,而是先將集合元素放入stream中,再由stream取出處理。而傳統的iteration是直接從集合取出元素並進行操作。
Aggregate operations支援行為方法的參數化。
Stream的forEach可利用Java 8的Lambda語法來將方法(函式)參數化並傳入來自訂處理方式。
參考:
沒有留言:
張貼留言