上一篇文章,小樂給你們介紹了《Java8新特性之方法引用》,下面接下來小樂將會給你們介紹Java8新特性之Stream,稱之爲流,本篇文章爲上半部分。java
Java Se中對於流的操做有輸入輸出IO流,而Java8中引入的Stream 屬於Java API中的一個新成員,它容許你以聲明性方式處理數據集合,Stream 使用一種相似 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 注意這裏的流操做能夠看作是對集合數據的處理。數據庫
簡單來講,流是一種數據渠道,用於操做數據源(集合、數組)所生產的元素序列。編程
整個流操做就是一條流水線,將元素放在流水線上一個個地進行處理。須要注意的是:不少流操做自己就會返回一個流,因此多個操做能夠直接鏈接起來, 以下圖這樣,操做能夠進行鏈式調用,而且並行流還能夠實現數據流並行處理操做。
segmentfault
Stream 和集合的其中一個差別在於何時進行計算,集合,它會包含當前數據結構中全部的值,你能夠隨時增刪,可是集合裏面的元素毫無疑問地都是已經計算好了的。 流則是按需計算,按照使用者的須要計算數據,你能夠想象咱們經過搜索引擎進行搜索,搜索出來的條目並非所有呈現出來的,並且先顯示最符合的前 10 條或者前 20 條,只有在點擊 「下一頁」 的時候,纔會再輸出新的 10 條。 數組
5.3.二、外部迭代與內部迭代數據結構
把集合比做一個工廠的倉庫,一開始工廠比較落後,要對貨物做什麼修改,只能工人親自走進倉庫對貨物進行處理,有時候還要將處理後的貨物放到一個新的倉庫裏面。在這個時期,咱們須要親自去作迭代,一個個地找到須要的貨物,並進行處理,這叫作外部迭代。 dom
後來工廠發展了起來,配備了流水線做業,只要根據需求設計出相應的流水線,而後工人只要把貨物放到流水線上,就能夠等着接收成果了,並且流水線還能夠根據要求直接把貨物輸送到相應的倉庫。這就叫作內部迭代,流水線已經幫你把迭代給完成了,你只須要說要幹什麼就能夠了(即設計出合理的流水線)。 編程語言
Java 8 引入 Stream 很大程度是由於,流的內部迭代能夠自動選擇一種合適你硬件的數據表示和並行實現。
函數式編程
在 Java 8 中, 集合接口有兩個方法來生成流:函數
示例代碼以下:
public static void main(String[] args) { /** * 定義集合l1 併爲集合建立串行流 */ List<String> l1 = Arrays.asList("周星馳", "周杰倫", "周星星", "周潤發"); // 返回串行流 l1.stream(); // 返回並行流 l1.parallelStream(); }
上述操做獲得的流是經過原始數據轉換過來的流,除了這種流建立的基本操做外,對於流的建立還有如下幾種方式。
Stream.of(T...) : Stream.of("aa", "bb") 生成流 //值建立流 生成一個字符串流 Stream<String> stream = Stream.of("java8", "Spring", "SpringCloud"); stream.forEach(System.out::println);
根據參數的數組類型建立對應的流。
// 只取索引第 1 到第 2 位的: int[] a = {1, 2, 3, 4}; Arrays.stream(a, 1, 3).forEach(System.out :: println);
//每一個元素是給定文件的其中一行 Stream<String> stream02 = Files.lines(Paths.get("data.txt"));
兩個方法:
//生成流,首元素爲 0,以後依次加 2 Stream.iterate(0, n -> n + 2) //生成流,爲 0 到 1 的隨機雙精度數 Stream.generate(Math :: random) //生成流,元素全爲 1 Stream.generate(() -> 1)
上半部分就介紹到這裏,下半部分將會給你們介紹流的中間操做和終止操做。請多關注!轉載請註明出處和做者。