摘要:需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。為集合創建并行流。
上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下面接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。
1、什么是流?Java Se中對于流的操作有輸入輸出IO流,而Java8中引入的Stream 屬于Java API中的一個新成員,它允許你以聲明性方式處理數據集合,Stream 使用一種類似 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 注意這里的流操作可以看做是對集合數據的處理。
簡單來說,流是一種數據渠道,用于操作數據源(集合、數組)所生產的元素序列。
元素序列 :就像集合一樣,流也提供了一個接口,可以訪問特定元素類型的一組有序值。
源:流會使用一個提供數據的源,如集合、數組或輸入/輸出資源。 請注意,從有序集 合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致
數據處理操作:流的數據處理功能支持類似于數據庫的操作,以及函數式編程語言中 的常用操作,如filter、 map、 reduce、 find、 match、 sort等。流操作可以順序執 行,也可并行執行。
流水線:很多流操作本身會返回一個流,這樣多個操作就可以鏈接起來,形成一個大 的流水線。
內部迭代:與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進行的。
2、流操作
整個流操作就是一條流水線,將元素放在流水線上一個個地進行處理。需要注意的是:很多流操作本身就會返回一個流,所以多個操作可以直接連接起來, 如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。
Stream 和集合的其中一個差異在于什么時候進行計算,集合,它會包含當前數據結構中所有的值,你可以隨時增刪,但是集合里面的元素毫無疑問地都是已經計算好了的。 流則是按需計算,按照使用者的需要計算數據,你可以想象我們通過搜索引擎進行搜索,搜索出來的條目并不是全部呈現出來的,而且先顯示最符合的前 10 條或者前 20 條,只有在點擊 “下一頁” 的時候,才會再輸出新的 10 條。
5.3.2、外部迭代與內部迭代
把集合比作一個工廠的倉庫,一開始工廠比較落后,要對貨物作什么修改,只能工人親自走進倉庫對貨物進行處理,有時候還要將處理后的貨物放到一個新的倉庫里面。在這個時期,我們需要親自去做迭代,一個個地找到需要的貨物,并進行處理,這叫做外部迭代。
后來工廠發展了起來,配備了流水線作業,只要根據需求設計出相應的流水線,然后工人只要把貨物放到流水線上,就可以等著接收成果了,而且流水線還可以根據要求直接把貨物輸送到相應的倉庫。這就叫做內部迭代,流水線已經幫你把迭代給完成了,你只需要說要干什么就可以了(即設計出合理的流水線)。
Java 8 引入 Stream 很大程度是因為,流的內部迭代可以自動選擇一種合適你硬件的數據表示和并行實現。
在 Java 8 中, 集合接口有兩個方法來生成流:
stream()?? 為集合創建串行流。
parallelStream()?? 為集合創建并行流。
示例代碼如下:
public static void main(String[] args) { /** * 定義集合l1 并為集合創建串行流 */ Listl1 = Arrays.asList("周星馳", "周杰倫", "周星星", "周潤發"); // 返回串行流 l1.stream(); // 返回并行流 l1.parallelStream(); }
上述操作得到的流是通過原始數據轉換過來的流,除了這種流創建的基本操作外,對于流的創建還有以下幾種方式。
4.1、值創建流Stream.of(T...) : Stream.of("aa", "bb") 生成流 //值創建流 生成一個字符串流 Stream4.2、數組創建流stream = Stream.of("java8", "Spring", "SpringCloud"); stream.forEach(System.out::println);
根據參數的數組類型創建對應的流。
Arrays.stream(T[ ])
Arrays.stream(int[ ])
Arrays.stream(double[ ])
Arrays.stream(long[ ])
// 只取索引第 1 到第 2 位的: int[] a = {1, 2, 3, 4}; Arrays.stream(a, 1, 3).forEach(System.out :: println);4.3、文件生成流
//每個元素是給定文件的其中一行 Stream4.4、函數生成流stream02 = Files.lines(Paths.get("data.txt"));
兩個方法:
iterate : 依次對每個新生成的值應用函數
generate :接受一個函數,生成一個新的值
//生成流,首元素為 0,之后依次加 2 Stream.iterate(0, n -> n + 2) //生成流,為 0 到 1 的隨機雙精度數 Stream.generate(Math :: random) //生成流,元素全為 1 Stream.generate(() -> 1)
上半部分就介紹到這里,下半部分將會給大家介紹流的中間操作和終止操作。請多關注!轉載請注明出處和作者。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77489.html
摘要:歸約操作計算有效訂單總金額有效訂單總金額收集數據收集將流轉換為其他形式,方法作為終端操作,接收一個接口的實現,用于給中元素做匯總的方法。 接上一篇:《Java8新特性之stream》,下面繼續接著講Stream 5、流的中間操作 常見的流的中間操作,歸為以下三大類:篩選和切片流操作、元素映射操作、元素排序操作:showImg(https://segmentfault.com/img/b...
摘要:大家好,我是樂字節的小樂。需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。為集合創建并行流。 大家好,我是樂字節的小樂。說起流,我們會聯想到手機、電腦組裝流水線,物流倉庫商品包裝流水線等等,如果把手機 ,電腦,包裹看做最終結果的話,那么加工商品前的各種零部件就可以看做數據源,而中間一系列的...
摘要:語法中接口可以包含實現方法,需要使用修飾,此類方法稱為默認方法。核心特性接口默認方法就介紹到這里了,后續小樂會繼續講述核心特性。 JAVA8已經發布很久,是自java5(2004年發布)之后Oracle發布的最重要的一個版本。其中包括語言、編譯器、庫、工具和JVM等諸多方面的新特性,對于國內外互聯網公司來說,Java8是以后技術開發的趨勢。這里主要講解在開發中幾個核心的新特性。(主要從...
摘要:大家好,上一篇小樂給大家講述了樂字節核心特性表達式,點擊回顧。接下來繼續核心特性之函數式接口。感謝大家欣賞小樂帶來的核心特性之函數式接口,接下來還會更多核心技術講解,請關注樂字節如需要視頻課程,請搜索樂字節騰訊課堂 大家好,上一篇小樂給大家講述了《樂字節-Java8核心特性-Lambda表達式》,點擊回顧。接下來繼續:Java8核心特性之函數式接口。 什么時候可以使用Lambda?通常...
摘要:大家好,我是樂字節的小樂,上一次我們說到了核心特性之函數式接口,接下來我們繼續了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達式。感謝光臨閱讀小樂的,敬請關注樂字節后續將繼續講述等前沿知識技術。 大家好,我是樂字節的小樂,上一次我們說到了Java8核心特性之函數式接口,接下來我們繼續了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
閱讀 1446·2021-11-16 11:44
閱讀 3286·2021-09-29 09:43
閱讀 620·2019-08-30 10:52
閱讀 938·2019-08-29 11:01
閱讀 3258·2019-08-26 11:47
閱讀 2885·2019-08-23 12:18
閱讀 1359·2019-08-22 17:04
閱讀 2046·2019-08-21 17:04