Java8 Stream

概述

Java8 API中添加了一個新的抽象成為流Stream,可以以一種聲明的方式處理數據。

Stream與java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是對集合對象功能的增強,專注與對集合對象進行各種非常便利、高效的聚合操作,或大批量數據操作。

Stream就像一個高級版本的迭代器,用戶只要給出需要對其包含的元素是執行什麼操作,Stream會在內部隱式進行遍歷,做出相應的數據轉換。

Stream和迭代器又有不同,Stream可以並行操作,即將數據分為多段,其中每一個都在不同的線程中處理,然後將結果一起輸出。

先看下面一個例子:

Java8 Stream

通過這個例子,可以看出引入流的操作後代碼的簡潔。

使用

使用Stream的步驟如下:

  1. 創建Stream
  2. 通過一個或多箇中間操作將流轉換成另一個流
  3. 通過中止操作獲取結果.

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(): 將流轉換成數組

當然還有其他操作,更多操作, 請自行嘗試


分享到:


相關文章: