中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Java8 Stream API

發布時間:2020-07-23 10:51:29 來源:億速云 閱讀:142 作者:小豬 欄目:編程語言

這篇文章主要講解了如何使用Java8 Stream API,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

1. 概述

Java 8 引入的一個重要的特性無疑是 Stream API。Stream 翻譯過來是“流”,突然想到的是大數據處理有個流式計算的概念,數據通過管道經過一個個處理器(Handler)進行篩選,聚合,而且流都具有向量性,強調的是對數據的計算處理,而集合強調的是數據集。Stream可以看做是一個可操作的數據集序列,它可以指定你希望對集合進行的操作,可以執行非常復雜的查找、過濾和映射數據等操作。有點類似于數據庫中的增刪改查操作。十分高效而且易于使用。

2. 創建Stream

從不同的數據源創建流有很多方式。 被創建的流并不能改變數據源。什么意思呢?打個比方,從一個集合創建流后,對流的操作并不會改變這個集合的數據狀態。我們還是舉個例子吧。

如何使用Java8 Stream API

如上圖, 我們將一個長度為3的集合放入一個流,過濾掉元素長度不超過4的元素,然后把剩下的迭代出來。同時我們還打印一下原始的數據源strArr集合長度看看是否發生了變化。結果雖然從流中移除了java這個元素但是strArr卻并沒有變化。

如何使用Java8 Stream API

接下來我們開始梳理一下創建流的方式。

2.1 空流

如何使用Java8 Stream API

你應該注意到上圖中我用Collections 創建了一個空的List,流也是一樣,而且這兩者的意義也是一樣的。都是避免為沒有元素而返回null

2.2 從集合創建流

如何使用Java8 Stream API

上面摘自java 8 Collection<E> 說明只要是Collection<E>的實現都可以創建流。

如何使用Java8 Stream API

2.3 從數組創建流

我們可以從數組來創建一個流,或者從數組中按照索引截取一部分創建流

如何使用Java8 Stream API

2.4 通過構造器創建流

Stream 提供建造者方法來構建流。不過請注意泛型約束,否則返回的是Object類型的流。

如何使用Java8 Stream API

2.5 無限流

generate() 方法接收 Supplier<T> 函數來生成元素,而且生成如果不加以限制將不會停止,直到內存限制。下面這個例子將生成長度為10,字符串元素長度為5的字符串流

如何使用Java8 Stream API

創建無限流的另一種方法是使用iterate() 方法。和generate() 方法一樣都要加以限制。不同的是 iterate()方法第一個參數作為起始的種子,第二個函數參數來定制生成元素的規則。下面這個例子是從1作為第一個元素,每個元素在上一個元素的基礎上加1,限制長度為10。下面將打印1-10。

如何使用Java8 Stream API

2.6 基本類型流

Java 8提供了從三種基本類型創建流的可能性:int,long和double。由于Stream <T>是一個通用接口,并且無法使用基本類型作為泛型的類型參數,因此創建了三個新的特殊接口:IntStreamLongStreamDoubleStream

使用這些新的API避免了不必要的自動裝箱,從而提高了生產率:

如何使用Java8 Stream API

以上兩個方法的起始都是從1開始,步長為1創建序列。區別就是endExclusive=3 range方法不包含3,而rangeClosed包括3。

從Java 8開始,Random類為生成基本類型流提供了廣泛的方法。例如,以下代碼創建一個DoubleStream,它有三個隨機double元素:

如何使用Java8 Stream API

2.7 字符串流

String也可以用作創建流的源。借助String類的chars()方法。由于沒有CharStream,在JDK的IntStream用于表示字符流代替。

如何使用Java8 Stream API

以下示例根據指定的RegExString拆分為子字符串:

如何使用Java8 Stream API

2.8 文件流

Java NIO類Files允許通過lines()方法生成文本文件的Stream <String>。文本的每一行都成為流的一個元素:

如何使用Java8 Stream API

你還可以在lines() 方法中指定字符集編碼。

2.9 并行流

并行流就是把一個內容分成多個數據塊,并用不同的線程分成多個數據塊,并用不同的線程分別處理每個數據塊的流。底層用了Fork/Join框架。該流主要用來處理大批量的數據源。少量數據不建議使用。帶有parallel的聲明方式都是并行流,這里不在介紹。

但是使用一定要注意數據并行處理同步。要么使用同步集合,諸如Collections.synchronized系列。或者在并行流收集元素到集合中時,調用collect方法,一定不要采用Foreach方法或者map方法。

3.流的引用

只要只調用中間操作,就可以實例化一個流并具有對它的可訪問引用。執行終端操作會使流不可訪問。從技術上講,以下代碼看上去是有效的:

如何使用Java8 Stream API

第3行是終端操作 如果接著執行第4行對stream進行重用將觸發IllegalStateException。一定要謹記 Java 8 中同一個Stream 在終端操作后是不能重用的。 正確的做法是這樣的:

如何使用Java8 Stream API

4.流的中間操作

中間操作就是對數據源中的數據的計算操作。其實上面我們已經對流進行很多的中間操作比如filter()limit()等等。網上很著名的一些中間操作講解

如何使用Java8 Stream API

如何使用Java8 Stream API

如何使用Java8 Stream API

如何使用Java8 Stream API 如何使用Java8 Stream API 如何使用Java8 Stream API

5.流的生命周期

創建Stream 一個數據源(如:集合、數組),獲取一個流中間操作 一個中間操作鏈,對數據源的數據進行處理終止操作(終端操作)一個終止操作,執行中間操作鏈,并產生結果,到此整個流消亡。

看完上述內容,是不是對如何使用Java8 Stream API有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榆社县| 蒙城县| 临猗县| 西贡区| 黄山市| 清徐县| 吕梁市| 独山县| 肇州县| 新河县| 南华县| 芜湖县| 延长县| 育儿| 曲沃县| 西平县| 南汇区| 阳信县| 利川市| 华坪县| 萨嘎县| 罗城| 大宁县| 巍山| 大同县| 皮山县| 麦盖提县| 玉龙| 若尔盖县| 锡林郭勒盟| 清流县| 桦甸市| 翁牛特旗| 开阳县| 濉溪县| 康马县| 北安市| 金昌市| 江油市| 宜川县| 平谷区|