1 知識框架
先上一張圖來說明一下Java8中”流”的引進、意義和優勢。
2 傳統Java集合的不足
2.1 傳統Java集合
集合是Java中用途十分廣泛的一個集合,正是因爲它對於數據的處理的優勢,幾乎任何一個Java應用程序都會設計對Java集合的製造和處理。
然而,一個傳統的Java集合僅僅是對Java集合內部的數據進行簡單的添加、刪除等操作,而且處理的數據類型有限。
當涉及到複雜的業務邏輯處理時,需要藉助大量的迭代器才能完成需求,操作繁瑣,工作量大。
2.2 聲明式操作
我們熟悉的數據庫SQL操作。例如:
SELECT name FROM users WHERE age < 30
上面的SQL查詢語句可以選出年齡小於30歲的用戶的用戶名。
在這裏,我們只需要顯式地聲明我們的需求”選出年齡小於30歲的用戶的用戶名”就可以了,而不需要考慮如何實現。
那麼,Java集合如何實現這種顯式的聲明操作呢?
3 流是什麼
3.1 實例講解
下面以一個實例展開講解,來更好地認識什麼是”流”。
現在這裏有若干鵝卵石,顏色、質量不等。
3.1.1 需求
1.挑選出質量小於500g的鵝卵石,並2.按照質量從大到小的順序將它們排成一條線。
3.1.2 Java7(集合)實現
1.使用迭代器篩選元素
List<Stone> stoneList = new ArrayList<Stone>();
for (Stone s : stoneLine) {
if (s.getWeight() < 500) {
stoneList.add(s);
}
}
2.使用匿名類對鵝卵石進行質量排序(從大到小)
Collections.sort(stoneList, new Comparator<Stone>() {
public int compare(Stone s1, Stone s2) {
return Integer.compare(s1.getWeight(), s2.getWeight());
}
});
3.將派好序的鵝卵石排成一條線(放到一起)
List<String> lastStoneList = new ArrayList<Stone>();
for (Stone s : stoneList) {
lastStoneList.add(s.getName());
}
}
3.1.3 Java8(Stream)實現
List<String> lastStoneList =
stoneLine.stream()
.filter(s -> s.getWeight() < 500)//挑選出質量小於500g的鵝卵石
.sorted(comparing(Stone::getWeight))//按照質量進行排序
.map(Stone::getName)//提取滿足要求的鵝卵石的名字
.collect(toList());//將名字保存到List中
3.2 什麼是流
流,是一系列數據項,它不是一種數據結構。
流可以進行相關的算法和計算,只是它並沒有顯式地表現,而是在內部進行隱式地操作。
4 流的優勢
流,解決了兩個問題,1.直接實現你”想要什麼”,2.可以進行並行處理。
流,的本質,集合Lambda表達式,對傳統Java集合的功能強化。
Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注於對集合對象進行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數據操作 (bulk data operation)。Stream API 藉助於同樣新出現的 Lambda 表達式,極大的提高編程效率和程序可讀性。同時它提供串行和並行兩種模式進行匯聚操作,併發模式能夠充分利用多核處理器的優勢,使用 fork/join 並行方式來拆分任務和加速處理過程。通常編寫並行代碼很難而且容易出錯, 但使用 Stream API 無需編寫一行多線程的代碼,就可以很方便地寫出高性能的併發程序。所以說,Java 8 中首次出現的 java.util.stream 是一個函數式語言+多核時代綜合影響的產物。