Stream 自 Java 8 開始支援,對 「資料集合」(Collection) 作 「管線式處理」 的工具。這對大資料有很多方便,不過也請別走火入魔,因為效能不會因此而提升。
目的
假設有一個類別 Member 如下
class Membert{
public int age;
public String name;
public Member(int age, String name){
this.age = age;
this.name = name;
}
}
然後使用如下收集數十萬,百萬個會員資料。
List<Member> users=new ArrayList<>(); users.add(new Member(18, "Thomas")); ..........
如果我們要將 age >=18 的會員名字收集起來,在 7版及之前的版本需使用如下
List<String> names=new ArrayList<>();
for (var u : users){
if (u.age>=10){
names.add(u.name);
}
}
若使用 7 版後的 Stream,可以精簡如下
List<String> names = users.stream()
.filter(x->x.age>=18)
.map(x->x.name)
.toList();
System.out.println(names);
乍看之下,Stream 是為了把 for 迴圈拿掉,讓操作類似 Python 的 Numpy。其實這還真的是 Stream 的目地,少了 for 及 if,提高程式的可讀性。但效能上,二者的效能幾乎是一樣的。
三個核心
Stream 有三個核心概念,分別說明如下
資料來源
可以由 List.stream()、Arrays.stream(陣列) 及 Stream.of() 三種方法產生 Stream。
中介操作
有 filter、map、sorted、distinct、limit,會回傳新的 Stream,所以可以一直接。
終端操作
真正的執行,回傳結果。常看到的有 forEach、peek、toList、collect、count、findFirst、anyMatch。
