1. 程式人生 > >Java8-流-簡介

Java8-流-簡介

幾乎每個java應用程式都會製造和處理集合,要是沒有集合,還能做什麼呢?儘管集合對於幾乎任何一個java應用都是不可或缺的,但是集合操作卻遠遠算不上完美

  • 很多業務邏輯都涉及類似於資料庫的操作,比如對幾道菜按照類別進行分組,查找出最貴的菜,大部分資料庫都允許你宣告式地指定這些操作,你不需要實現如何篩選,你只需要表達你想要的,都替你辦好了,怎麼到了集合就不能這樣了呢?
  • 如果要處理大量元素該怎麼辦?為了提高效能,你需要並行處理 ,並利用多核架構,但是寫並行程式碼比迭代器還複製,除錯困難

為了解決這些問題,java語言的設計者做做些什麼.你可能已經猜到了,答案就是

流是什麼

流是Java API的新成員,它允許你以宣告性的方式處理資料集合(通過查詢語句來表達,而不是臨時寫一個實現),你可以把他們看成遍歷資料集的高階迭代器,此外,流還可以透明的並行處理,你無需寫任何多執行緒的程式碼了

比較java7與java8

寫一段返回低熱量菜餚名稱,並按照卡路里排序的程式碼

java7:

java8:

為了利用多核架構並行執行這段程式碼,你只需要把stream()快取parallelStream()

java8優勢

  • 程式碼時宣告式的,說明你想要完成什麼,而不是說明如何實現
  • 你可以把幾個基礎操作連線起來,來表達複雜的資料操作流水線
  • 用不著為了任務並行而去操心執行緒和鎖了,streamAPI都幫你做好了

簡而言之,java8 Stream

  • 宣告性–更簡潔,更易讀
  • 可複用–更靈活
  • 可並行–效能更好

流簡介

要討論流我們先來談談集合,這是最容易上手的方式了,java8中的集合支援一歌新的stream方法,會返回一個流,當然還有很多其他的方法可以得到流,比如利用資料範圍或從I/O資源生成流元素

流定義

簡單的定義就是,從支援資料處理操作的源生成的元素序列

  • 元素序列–集合講的是資料,流講的是計算
  • 源–流會使用一個提供資料的源,有序集合和列表生成的流,元素順序會被執
  • 流水線 很多流操作本身返回一個流,這樣多個操作就可以連結起來,形成一個大的流水線
  • 內部迭代–流的迭代操作是在背後進行的

流與集合對比

粗略的說,集合與流之間的差異在於什麼時候進行計算

集合是一個記憶體中的資料結構,它包含資料解僱中目前所有的值

流則是在概念上固定的資料結構,元素是按需計算的,那些值,在看不見的地方,只會按需生成,這是一種生產者-消費者關係,從另一個角度來說,流就是像一個延遲建立的集合,只有在消費者要求的時候才會計算值

用DVD對比線上流媒體的例子展示流與集合之間的差異

只能遍歷一次

流只能遍歷一次,遍歷完了之後,我們說這個流已經被消費掉了
你可以從原始資料哪裡再獲得一個新的流來重新遍歷一遍,就想迭代器一樣

外部迭代與內部迭代

流操作

流操作可以分為兩大類,我們看下前面的例子:

  • filter、map、limit可以連成一條流水線
  • collect觸發流水線執行並關閉它

可以連線起來的流操作稱為中間操作,關閉流的操作稱為終端操作

中間操作

觸發流水線上觸發一個終端操作,否則中間操作不會執行任何處理,他們很懶,這是因為中間操作一般都可以合併起來,在終端操作時一次性全部處理,只使用一次遍歷

終端操作

終端操作會從流的流水線生成結果,其結果是任何不是流的值,比如List,Integer,甚至是void

使用流

流的使用一般包括三件事:

  • 一個數據源來執行一個查詢
  • 一箇中間操作鏈,形成一條流的流水線
  • 一個終端操作,執行流水線,並生成結果

操作列表(不完全,以後還會介紹更多):

小結

  • 流是“從支援資料處理操作的源生成的一系列元素”
  • 流利用內部迭代
  • 流操作有兩類:中間操作和終端操作
  • 中間操作返回一個流,並可以連結在一起,可以用他們來設定一條流水線,但並不會生成任何結果
  • 終端操作會返回一個非流的值,並處理流水線的返回結構
  • 流中的元素是按需計算的

(注:內容整理自《Java8實戰》)