傳統集合操作屬於「外部迭代」:由呼叫端控制迴圈、攜帶狀態。Stream 引入「內部迭代」:宣告式描述資料轉換管線,資料如流水般流經各階段,無需顯式儲存中間結果。
List<Contact> contacts = new ArrayList<>();
contactList.forEach(s -> {
Contact c = new Contact();
c.setName(s);
contacts.add(c);
});
List<Contact> valid = new ArrayList<>();
contacts.forEach(c -> {
if (c.call()) valid.add(c);
});
System.out.println(valid.size());
long count = contactList.stream()
.map(s -> new Contact().setName(s)) // String -> Contact
.filter(c -> c.call()) // 保留通話成功
.count(); // 終端操作:計數
stream() 開啟管線,map() 轉換型別,filter() 篩選,count() 觸發執行並產出結果。中間操作(map/filter)是惰性的,只有終端操作才會真正執行。
parallelStream() 即可利用多核心加速大量資料處理public class Contact {
private String name;
private Random random = new Random();
public Contact setName(String name) { this.name = name; return this; }
public boolean call() { return random.nextBoolean(); } // 模擬通話成敗
}
Stream 寫法精簡且語意清晰,順序執行效能約為傳統迴圈 2 倍;並行流在大資料集下優勢明顯。代價是初學者需適應宣告式思維。
Stream 將「如何做」轉為「做什麼」,配合 Lambda 表達式,讓集合處理更符合函數式程式設計範式,為後續並行計算奠基。