Java8-流-簡介
幾乎每個java應用程式都會製造和處理集合,要是沒有集合,還能做什麼呢?儘管集合對於幾乎任何一個java應用都是不可或缺的,但是集合操作卻遠遠算不上完美
- 很多業務邏輯都涉及類似於資料庫的操作,比如對幾道菜按照類別進行分組,查找出最貴的菜,大部分資料庫都允許你宣告式地指定這些操作,你不需要實現如何篩選,你只需要表達你想要的,都替你辦好了,怎麼到了集合就不能這樣了呢?
- 如果要處理大量元素該怎麼辦?為了提高效能,你需要並行處理 ,並利用多核架構,但是寫並行程式碼比迭代器還複製,除錯困難
為了解決這些問題,java語言的設計者做做些什麼.你可能已經猜到了,答案就是流
流是什麼
流是Java API的新成員,它允許你以宣告性的方式處理資料集合(通過查詢語句來表達,而不是臨時寫一個實現),你可以把他們看成遍歷資料集的高階迭代器,此外,流還可以透明的並行處理,你無需寫任何多執行緒的程式碼了
比較java7與java8
寫一段返回低熱量菜餚名稱,並按照卡路里排序的程式碼
java8:
為了利用多核架構並行執行這段程式碼,你只需要把stream()快取parallelStream()
java8優勢
- 程式碼時宣告式的,說明你想要完成什麼,而不是說明如何實現
- 你可以把幾個基礎操作連線起來,來表達複雜的資料操作流水線
- 用不著為了任務並行而去操心執行緒和鎖了,streamAPI都幫你做好了
簡而言之,java8 Stream
- 宣告性–更簡潔,更易讀
- 可複用–更靈活
- 可並行–效能更好
流簡介
要討論流我們先來談談集合,這是最容易上手的方式了,java8中的集合支援一歌新的stream方法,會返回一個流,當然還有很多其他的方法可以得到流,比如利用資料範圍或從I/O資源生成流元素
流定義
簡單的定義就是,從支援資料處理操作的源生成的元素序列
- 元素序列–集合講的是資料,流講的是計算
- 源–流會使用一個提供資料的源,有序集合和列表生成的流,元素順序會被執
- 流水線 很多流操作本身返回一個流,這樣多個操作就可以連結起來,形成一個大的流水線
- 內部迭代–流的迭代操作是在背後進行的
流與集合對比
粗略的說,集合與流之間的差異在於什麼時候進行計算
集合是一個記憶體中的資料結構,它包含資料解僱中目前所有的值
流則是在概念上固定的資料結構,元素是按需計算的,那些值,在看不見的地方,只會按需生成,這是一種生產者-消費者關係,從另一個角度來說,流就是像一個延遲建立的集合,只有在消費者要求的時候才會計算值
只能遍歷一次
流只能遍歷一次,遍歷完了之後,我們說這個流已經被消費掉了
你可以從原始資料哪裡再獲得一個新的流來重新遍歷一遍,就想迭代器一樣
外部迭代與內部迭代
流操作
- filter、map、limit可以連成一條流水線
- collect觸發流水線執行並關閉它
可以連線起來的流操作稱為中間操作,關閉流的操作稱為終端操作
中間操作
觸發流水線上觸發一個終端操作,否則中間操作不會執行任何處理,他們很懶,這是因為中間操作一般都可以合併起來,在終端操作時一次性全部處理,只使用一次遍歷
終端操作
終端操作會從流的流水線生成結果,其結果是任何不是流的值,比如List,Integer,甚至是void
使用流
流的使用一般包括三件事:
- 一個數據源來執行一個查詢
- 一箇中間操作鏈,形成一條流的流水線
- 一個終端操作,執行流水線,並生成結果
小結
- 流是“從支援資料處理操作的源生成的一系列元素”
- 流利用內部迭代
- 流操作有兩類:中間操作和終端操作
- 中間操作返回一個流,並可以連結在一起,可以用他們來設定一條流水線,但並不會生成任何結果
- 終端操作會返回一個非流的值,並處理流水線的返回結構
- 流中的元素是按需計算的
(注:內容整理自《Java8實戰》)