樂位元組-Java8新特性之Stream流(上)

来源:https://www.cnblogs.com/lotbyte/archive/2019/04/09/10679663.html
-Advertisement-
Play Games

上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下麵接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。 1、什麼是流? Java Se中對於流的操作有輸入輸出IO流,而Java8中引入的Stream 屬於Java API中的一個新成員,它允許你以聲明性 ...


上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下麵接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。

 

1、什麼是流?

Java Se中對於流的操作有輸入輸出IO流,而Java8中引入的Stream 屬於Java API中的一個新成員,它允許你以聲明性方式處理數據集合,Stream 使用一種類似 SQL 語句從資料庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 註意這裡的流操作可以看做是對集合數據的處理。

簡單來說,流是一種數據渠道,用於操作數據源(集合、數組)所生產的元素序列。

  • 元素序列 :就像集合一樣,流也提供了一個介面,可以訪問特定元素類型的一組有序值。

  • 源:流會使用一個提供數據的源,如集合、數組或輸入/輸出資源。 請註意,從有序集 合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致

  • 數據處理操作:流的數據處理功能支持類似於資料庫的操作,以及函數式編程語言中 的常用操作,如filter、 map、 reduce、 find、 match、 sort等。流操作可以順序執 行,也可並行執行。

  • 流水線:很多流操作本身會返回一個流,這樣多個操作就可以鏈接起來,形成一個大 的流水線。

  • 內部迭代:與使用迭代器顯式迭代的集合不同,流的迭代操作是在背後進行的。

 

2、流操作

 

整個流操作就是一條流水線,將元素放在流水線上一個個地進行處理。需要註意的是:很多流操作本身就會返回一個流,所以多個操作可以直接連接起來, 如下圖這樣,操作可以進行鏈式調用,並且並行流還可以實現數據流並行處理操作。

3、流與集合

3.1、計算的時機

Stream 和集合的其中一個差異在於什麼時候進行計算,集合,它會包含當前數據結構中所有的值,你可以隨時增刪,但是集合裡面的元素毫無疑問地都是已經計算好了的。 流則是按需計算,按照使用者的需要計算數據,你可以想象我們通過搜索引擎進行搜索,搜索出來的條目並不是全部呈現出來的,而且先顯示最符合的前 10 條或者前 20 條,只有在點擊 “下一頁” 的時候,才會再輸出新的 10 條。

 

 

3.2、外部迭代與內部迭代

把集合比作一個工廠的倉庫,一開始工廠比較落後,要對貨物作什麼修改,只能工人親自走進倉庫對貨物進行處理,有時候還要將處理後的貨物放到一個新的倉庫裡面。在這個時期,我們需要親自去做迭代,一個個地找到需要的貨物,併進行處理,這叫做外部迭代 後來工廠發展了起來,配備了流水線作業,只要根據需求設計出相應的流水線,然後工人只要把貨物放到流水線上,就可以等著接收成果了,而且流水線還可以根據要求直接把貨物輸送到相應的倉庫。這就叫做內部迭代,流水線已經幫你把迭代給完成了,你只需要說要乾什麼就可以了(即設計出合理的流水線)。 Java 8 引入 Stream 很大程度是因為,流的內部迭代可以自動選擇一種合適你硬體的數據表示和並行實現。

 

4、創建流

在 Java 8 中, 集合介面有兩個方法來生成流:

  • stream() − 為集合創建串列流。

  • parallelStream() − 為集合創建並行流。

示例代碼如下:

public static void main(String[] args) {
    /**
         * 定義集合l1 併為集合創建串列流
         */
    List<String> l1 = Arrays.asList("周星馳", "周傑倫", "周星星", "周潤發");
    // 返回串列流
    l1.stream();
    // 返回並行流
    l1.parallelStream();
}

  

上述操作得到的流是通過原始數據轉換過來的流,除了這種流創建的基本操作外,對於流的創建還有以下幾種方式。

 

4.1、值創建流

Stream.of(T...) : Stream.of("aa", "bb") 生成流

//值創建流 生成一個字元串流
Stream<String> stream = Stream.of("java8", "Spring", "SpringCloud");
stream.forEach(System.out::println);

  

4.2、數組創建流

根據參數的數組類型創建對應的流。

  • 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、文件生成流

//每個元素是給定文件的其中一行
Stream<String> stream02 = Files.lines(Paths.get("data.txt"));

  

4.4、函數生成流

兩個方法:

  • iterate : 依次對每個新生成的值應用函數

  • generate :接受一個函數,生成一個新的值

//生成流,首元素為 0,之後依次加 2
Stream.iterate(0, n -> n + 2)
//生成流,為 0 到 1 的隨機雙精度數
Stream.generate(Math :: random)
//生成流,元素全為 1
Stream.generate(() -> 1)

 

上半部分就介紹到這裡,下半部分將會給大家介紹流的中間操作和終止操作。請多關註!轉載請註明出處和作者。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 武Sir博客拿的面試題,答案都是自己寫的,多有不足,請多多指教。更新中。。。。。。 1.為什麼學習Python? a.寫起來快,看起來明白。作為通用性的語言,除了一些對性能要求很高的場合,幾乎什麼都能幹,常見領域:web伺服器、計算科學、程式腳本、系統管理 2.通過什麼途徑學Python? 看各種教 ...
  • 1 什麼是項目 在既定的資源和要求的約束下,為實現某種目的而相互聯繫的一次性工作任務。項目可以創造:1.一個產品;2.一種服務或提供服務的能力;3.對現有產品線或服務的改進;4.一種成果。 項目的兩大特性:1.臨時性(Temporary)項目有明確的起點和終點,臨時性並不意味著持續時間短,很多項目的 ...
  • 一、資料庫操作 1,orm 2,Flask-SQLAlchemy 2.1 資料庫連接設置 2.2 常用的sqlalchemy欄位類型 2.3 常用的SQLALchemy列選項 2.4 常用的SQLALchemy關係選項 3,資料庫基本操作 3.1 在視圖函數中定義模型類 模型之間的關聯 一對多: 多 ...
  • 關於Java中語句符號及格式的理解 這篇文章是撰寫的第一篇文章,在此作一下博主是一名在讀的工科研究生,種種原因,研二開始決定轉行從事程式員工作。開始的自學之路並不算非常順暢,也走了一點彎路,但一直都堅持了下來,慢慢地,在學習的過程中漸入佳境,找到了學習的興趣和成就感。開通這個博客,既有出於在技術層面 ...
  • 前言 假如要你實現一個可以識別表達式的簡易計算器,你會怎麼實現?例如用戶輸入: 可以直接得出計算結果:-7。對於人類來說,我們很容易計算出來,因為我們從左往右看,看到後面括弧時,知道括弧內的計算優先順序最高,因此可以先計算括弧內的,然後反過來計算乘法,最後計算加法,得到最終結果。 尾碼表達式 而對於計 ...
  • 1、類規範 類聲明:包括數據成員、成員函數(共有介面)的聲明 類方法定義 C++程式員將介面(類)放在頭文件中,將實現放在源代碼文件中 類設計儘量將共有介面和實現細節分開,數據隱藏(將數據放在私有部分中)是一種封裝,將實現細節隱藏在私有部分中也是一種封裝。將類函數定義和類聲明放在不同文件中也是一種封 ...
  • this關鍵字: (1)this(當局部變數和成員變數重名時,可以用關鍵字this區分) this代表對象,當前對象 this就是所在函數所屬對象的引用 簡單來說,哪個對象調用了所在的函數,this就代表哪個對象 (2)構造函數調用構造函數,用this調用成員 對this的調用必須是構造函數第一個語 ...
  • 今天清明節假期結束第二天,昨天請了一天假去考科目二,還好考過了,O(∩_∩)O哈哈~~~~ 今天老師講了類的屬性與方法的使用 就用代碼來說明吧: package pkg3;public class Test{ private int a1=0; //這就是聲明屬性a1、a2、a3、、、、 priva ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...