樂位元組-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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...