最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8 Stream API 詳細使用方法與操作技巧指南

 更新時間:2020年05月20日 10:42:15   作者:碼農小胖哥  
這篇文章主要介紹了Java8 Stream API 詳細使用方法與操作技巧,總結分析了Java8 Stream API 基本功能、使用方法與操作注意事項,需要的朋友可以參考下

本文實例講述了Java8 Stream API 詳細使用方法與操作技巧。分享給大家供大家參考,具體如下:

1. 概述

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

2. 創(chuàng)建Stream

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

file

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

file

接下來我們開始梳理一下創(chuàng)建流的方式。

2.1 空流

file

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

2.2 從集合創(chuàng)建流

file

上面摘自java 8 Collection<E> 說明只要是Collection<E>的實現(xiàn)都可以創(chuàng)建流。

file

2.3 從數(shù)組創(chuàng)建流

我們可以從數(shù)組來創(chuàng)建一個流,或者從數(shù)組中按照索引截取一部分創(chuàng)建流

file

2.4 通過構造器創(chuàng)建流

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

file

2.5 無限流

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

file

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

file

2.6 基本類型流

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

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

file

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

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

file

2.7 字符串流

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

file

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

file

2.8 文件流

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

file

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

2.9 并行流

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

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

3.流的引用

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

file

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

file

4.流的中間操作

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

file

file

file

file file file

5.流的生命周期

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

6.總結

Java 8 Stream 具有里程碑的意義。改變了以往對數(shù)據(jù)處理的模式。通過本篇對流以及流的生命周期都做了詳盡的說明。相信你已經能夠通過Stream來提高你的開發(fā)效率。

更多關于java算法相關內容感興趣的讀者可查看本站專題:《Java文件與目錄操作技巧匯總》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • IDEA自定義Maven archetype的方法步驟

    IDEA自定義Maven archetype的方法步驟

    在創(chuàng)建Maven的項目時我們發(fā)現(xiàn)了一個很不方便的問題,就是每次創(chuàng)建Maven的工程的時候,都需要選擇一個骨架,本文主要介紹了IDEA自定義Maven archetype的方法步驟,感興趣的可以了解一下
    2022-03-03
  • resultMap標簽中里的collection標簽詳解

    resultMap標簽中里的collection標簽詳解

    這篇文章主要介紹了resultMap標簽中里的collection標簽,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺談Java之終止繼承:Final類和Fianl方法

    淺談Java之終止繼承:Final類和Fianl方法

    這篇文章主要介紹了Java之終止繼承:Final類和Fianl方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Mybatis如何傳入多個參數(shù)的實現(xiàn)代碼

    Mybatis如何傳入多個參數(shù)的實現(xiàn)代碼

    這篇文章主要介紹了Mybatis如何傳入多個參數(shù)的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • SpringBoot常用讀取配置文件的3種方法小結

    SpringBoot常用讀取配置文件的3種方法小結

    本文主要介紹了SpringBoot常用讀取配置文件的3種方法小結,主要包括@Value讀取配置文件,@ConfigurationProperties 讀取配置文件和讀取配置文件中的List,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • java中break和continue源碼解析

    java中break和continue源碼解析

    這篇文章主要針對java中break和continue的區(qū)別進行詳細介紹,幫助大家更好的學習了解java中break和continue源碼,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Springboot實現(xiàn)VNC的反向代理功能

    Springboot實現(xiàn)VNC的反向代理功能

    這篇文章主要介紹了Springboot實現(xiàn)VNC的反向代理,搭建過程也很簡單,通過注冊bean攔截指定URL路徑進行自定義操作,具體實例代碼跟隨小編一起看看需要的朋友可以參考下
    2021-09-09
  • 使用Spring的AbstractRoutingDataSource實現(xiàn)多數(shù)據(jù)源切換示例

    使用Spring的AbstractRoutingDataSource實現(xiàn)多數(shù)據(jù)源切換示例

    這篇文章主要介紹了使用Spring的AbstractRoutingDataSource實現(xiàn)多數(shù)據(jù)源切換示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java如何獲取發(fā)送請求的電腦的IP地址

    Java如何獲取發(fā)送請求的電腦的IP地址

    文章介紹了如何通過HttpServletRequest獲取客戶端IP地址,特別是當客戶端通過代理訪問時,如何使用x-forwarded-for頭來獲取真實的IP地址
    2024-11-11
  • Java自動化工具Ant的基礎使用教程

    Java自動化工具Ant的基礎使用教程

    這篇文章主要介紹了Java自動化工具Ant的基礎使用教程,例子在Windows系統(tǒng)下操作演示,講解了Ant基本的文件操作和屬性,需要的朋友可以參考下
    2016-02-02

最新評論

山东| 闽侯县| 西乌| 义乌市| 丹阳市| 文山县| 固阳县| 内乡县| 隆昌县| 海原县| 刚察县| 澄城县| 呼图壁县| 禹州市| 岫岩| 武邑县| 清水河县| 阿拉尔市| 南京市| 双城市| 新绛县| 阜城县| 桐梓县| 治县。| 象山县| 陵水| 澄江县| 恩平市| 福清市| 淮南市| 甘肃省| 聂荣县| 宁津县| 芷江| 远安县| 根河市| 陆丰市| 肇东市| 荣昌县| 通州区| 禹州市|