網頁

2018/10/26

Java 8 Stream聚合操作(aggregate operations)的forEach()與迭代(iterations)的區別

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語法來將方法(函式)參數化並傳入來自訂處理方式。


參考:

沒有留言:

張貼留言