概述
Java8 API中添加了一個新的抽象成為流Stream,可以以一種聲明的方式處理數據。
Stream與java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是對集合對象功能的增強,專注與對集合對象進行各種非常便利、高效的聚合操作,或大批量數據操作。
Stream就像一個高級版本的迭代器,用戶只要給出需要對其包含的元素是執行什麼操作,Stream會在內部隱式進行遍歷,做出相應的數據轉換。
Stream和迭代器又有不同,Stream可以並行操作,即將數據分為多段,其中每一個都在不同的線程中處理,然後將結果一起輸出。
先看下面一個例子:
通過這個例子,可以看出引入流的操作後代碼的簡潔。
使用
使用Stream的步驟如下:
- 創建Stream
- 通過一個或多箇中間操作將流轉換成另一個流
- 通過中止操作獲取結果.
1.創建Stream
集合類Collection:
- stream(): 創建串行流
- parallelStream(): 創建並行流
數組:
Arrays.stream(arr): 通過靜態方法獲取數組的串行流
Arrays.stream(arr, int, int): 返回數組的串行流,指定數組範圍
數字類:
IntStream: 整型的流接口, 有如下靜態方法:
- empty(): 獲取一個空的串行流
- generate(IntSupplier): 返回指定接口產生的數字無限流
- of(int,int...): 返回指定數字的串行流
- of(int): 返回包含指定數字的串行流
- range(start, end): 返回從start到end的整數流, 前閉後開
- rangeClosed(start, end): 返回從start到end的整數流, 前閉後閉
DoubleStream: 小數的流接口, 有如下靜態方法:
- of(double,double...): 返回指定數字的串行流
- of(double): 返回包含指定數字的串行流
- generate(IntSupplier): 返回指定接口產生的數字無限流
LongStream: 長整形的流接口, 有如下靜態方法:
- generate(IntSupplier): 返回指定接口產生的數字無限流
- of(long,long...): 返回指定數字的串行流
- of(long): 返回包含指定數字的串行流
- range(start, end): 返回從start到end的整數流, 前閉後開
- rangeClosed(start, end): 返回從start到end的整數流, 前閉後閉
Random: 隨機數, 有如下方法生成流(不是靜態方法)
- doubles(): 返回無限的隨機數流, 值在0-1之間
- double(long): 返回給定數量的隨機數流, 值在0-1之間
- doubles(start, end): 返回無限的隨機數流, 值在start-end之間
- doubles(long, start, end): 返回給定數量的隨機數流, 值在start-end之間
- ints(), longs() 與doubles函數相同
等等操作, 請自行嘗試
2.流操作
Stream: 流的接口, 其中定義瞭如下對流中間操作的方法:
- distinct(): 對流中元素去重, 通過equals函數
- filter(function): 對流中元素進行過濾, 去除經過方法返回false的元素
- limit(long): 截取流的前long個元素
- skip(long): 丟棄流中的前long個元素
- map(function): 將流中的每個元素經過方法進行計算
- mapToDouble(function): 將流中每個元素經過方法轉換成Double
- mapToInt(function): 將流中每個元素經過方法轉換成Int
- mapToLong(function): 將流中每個元素經過方法轉換成Long
- sorted(): 對流中元素根據自然順序進行排序
- sorted(function): 根據方法的比較結果對流中元素進行排序
當然還有其它操作
3.獲取結果操作
Stream: 流的接口, 其中定義瞭如下對流結果操作的方法:
- forEach(function): 對流中元素進行遍歷
- allMatch(function): 判斷流中是否所有元素經過函數均為true
- anyMatch(function): 判斷流中是否存在經過函數返回true的原上訴
- noneMatch(function): 判斷流中是否所以有元素經過函數均為false
- count(): 統計流中元素的個數
- max(function): 經過指定函數進行比較,返回最大值
- min(function): 經過指定函數進行比較,返回最小值
- toArray(): 將流轉換成數組
當然還有其他操作,更多操作, 請自行嘗試
閱讀更多 學習編程 的文章