欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1. 概述

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

2. 創(chuàng)建Stream

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

file

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

file

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

2.1 空流

file

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

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

file

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

file

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

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

file

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

Stream 提供建造者方法來(lái)構(gòu)建流。不過請(qǐng)注意泛型約束,否則返回的是Object類型的流。

file

2.5 無(wú)限流

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

file

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

file

2.6 基本類型流

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

使用這些新的API避免了不必要的自動(dòng)裝箱,從而提高了生產(chǎn)率:

file

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

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

file

2.7 字符串流

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

file

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

file

2.8 文件流

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

file

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

2.9 并行流

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

但是使用一定要注意數(shù)據(jù)并行處理同步。要么使用同步集合,諸如Collections.synchronized系列?;蛘咴诓⑿辛魇占氐郊现袝r(shí),調(diào)用collect方法,一定不要采用Foreach方法或者map方法。

3.流的引用

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

file

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

file

4.流的中間操作

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

file

file

file

file file file

5.流的生命周期

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

6.總結(jié)

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

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

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一行java代碼實(shí)現(xiàn)高斯模糊效果

    一行java代碼實(shí)現(xiàn)高斯模糊效果

    這篇文章主要為大家詳細(xì)介紹了一行java代碼實(shí)現(xiàn)高斯模糊效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • JPA默認(rèn)值設(shè)置沒有效果的解決

    JPA默認(rèn)值設(shè)置沒有效果的解決

    這篇文章主要介紹了JPA默認(rèn)值設(shè)置沒有效果的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java加載property文件配置過程解析

    Java加載property文件配置過程解析

    這篇文章主要介紹了java加載property文件配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java?Spring?Boot的介紹與初體驗(yàn)

    java?Spring?Boot的介紹與初體驗(yàn)

    大家好,本篇文章主要講的是java?Spring?Boot的介紹與初體驗(yàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 基于Class.forName()用法及說明

    基于Class.forName()用法及說明

    這篇文章主要介紹了基于Class.forName()用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java解析word,獲取文檔中圖片位置的方法

    Java解析word,獲取文檔中圖片位置的方法

    下面小編就為大家分享一篇Java解析word,獲取文檔中圖片位置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-01-01
  • springmvc處理模型數(shù)據(jù)Map過程解析

    springmvc處理模型數(shù)據(jù)Map過程解析

    這篇文章主要介紹了springmvc處理模型數(shù)據(jù)Map過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • IDEA安裝阿里代碼規(guī)范插件的步驟圖文詳解

    IDEA安裝阿里代碼規(guī)范插件的步驟圖文詳解

    這篇文章主要介紹了IDEA安裝阿里代碼規(guī)范插件的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringMVC?RESTFul及REST架構(gòu)風(fēng)格介紹

    SpringMVC?RESTFul及REST架構(gòu)風(fēng)格介紹

    這篇文章主要為大家介紹了SpringMVC?RESTFul及REST架構(gòu)風(fēng)格介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Sa-Token記住我模式實(shí)現(xiàn)七天免登錄

    Sa-Token記住我模式實(shí)現(xiàn)七天免登錄

    這篇文章主要為大家介紹了Sa-Token記住我模式實(shí)現(xiàn)七天免登錄示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論