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

使用Java8?Stream流的skip?+?limit實(shí)現(xiàn)批處理的方法

 更新時(shí)間:2022年07月05日 10:07:55   作者:南北12345678  
Stream 作為 Java 8 的一大亮點(diǎn),它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念這篇文章主要介紹了使用Java8?Stream流的skip?+?limit實(shí)現(xiàn)批處理,需要的朋友可以參考下

為什么需要 Stream

Stream 作為 Java 8 的一大亮點(diǎn),它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 對 XML 解析的 Stream,也不是 Amazon Kinesis 對大數(shù)據(jù)實(shí)時(shí)處理的 Stream。Java 8 中的 Stream 是對集合(Collection)對象功能的增強(qiáng),它專注于對集合對象進(jìn)行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數(shù)據(jù)操作 (bulk data operation)。Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式,極大的提高編程效率和程序可讀性。同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢,使用 fork/join 并行方式來拆分任務(wù)和加速處理過程。通常編寫并行代碼很難而且容易出錯(cuò), 但使用 Stream API 無需編寫一行多線程的代碼,就可以很方便地寫出高性能的并發(fā)程序。所以說,Java 8 中首次出現(xiàn)的 java.util.stream 是一個(gè)函數(shù)式語言+多核時(shí)代綜合影響的產(chǎn)物。

什么是流

Stream不是集合元素,它不是數(shù)據(jù)結(jié)構(gòu)并不保存數(shù)據(jù),它是有關(guān)算法和計(jì)算的,它更像一個(gè)高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個(gè)一個(gè)遍歷元素并對其執(zhí)行某些操作;高級版本的 Stream,用戶只要給出需要對其包含的元素執(zhí)行什么操作,比如 “過濾掉長度大于 10 的字符串”、“獲取每個(gè)字符串的首字母”等,Stream 會(huì)隱式地在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。Stream 就如同一個(gè)迭代器(Iterator),單向,不可往復(fù),數(shù)據(jù)只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復(fù)返。而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顧名思義,當(dāng)使用串行方式去遍歷時(shí),每個(gè) item 讀完后再讀下一個(gè) item。而使用并行去遍歷時(shí),數(shù)據(jù)會(huì)被分成多個(gè)段,其中每一個(gè)都在不同的線程中處理,然后將結(jié)果一起輸出。Stream 的并行操作依賴于 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務(wù)和加速處理過程。Java 的并行 API 演變歷程基本如下:

  • 1.0-1.4 中的 java.lang.Thread
  • 5.0 中的 java.util.concurrent
  • 6.0 中的 Phasers 等
  • 7.0 中的 Fork/Join 框架
  • 8.0 中的 Lambda

Stream 的另外一大特點(diǎn)是,數(shù)據(jù)源本身可以是無限的。

1、一般進(jìn)行批處理時(shí)會(huì)將數(shù)據(jù)加入到一個(gè)臨時(shí)的集合中,當(dāng)數(shù)據(jù)量達(dá)到一定大小后進(jìn)行下一步操作,數(shù)據(jù)量不足時(shí)需要進(jìn)行額外的判斷;

2、若使用Java8的Stream流中的 skip + limit 則可以讓我們對集合方便快捷的操作,其中:
(1)skip(x):返回丟棄流中的前x個(gè)元素后剩下元素組成的新流;若原流中包含的元素個(gè)數(shù)小于x,則返回空流。
(2)limit(x): 對一個(gè)Stream流進(jìn)行截?cái)嗖僮?,獲取其前x個(gè)元素;若原流中包含的元素個(gè)數(shù)小于x,那就獲取其所有的元素;

3、實(shí)例代碼如下:

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 10; i < 36; i++) {
            list.add(i);
        }
        int limit = 10;
        for (int offset = 0; offset < list.size(); offset += limit) {
            List<Integer> subList = list.stream()
                                        .skip(offset)
                                        .limit(limit)
                                        .collect(Collectors.toList());
            System.out.println(subList);
        }
}

輸出結(jié)果:

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[30, 31, 32, 33, 34, 35]

3、通過結(jié)果也可以看出 skip 配合 limit 操作使用時(shí), limit 是最多取出限制的大小,不用再判斷最后一批數(shù)據(jù)量大小不夠限定的大小時(shí)的處理。

改進(jìn)版

int j = 0, size = list.size(), batchSize = 100;
while (j < size) {
    batchList = list.stream().skip(j).limit(Math.min(j + batchSize, size) - j).collect(Collectors.toList());
    j += batchSize;
}

到此這篇關(guān)于使用Java8 Stream流的skip + limit實(shí)現(xiàn)批處理的文章就介紹到這了,更多相關(guān)Java8 Stream流批處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 超簡單的java獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的實(shí)例(鼠標(biāo)在Jframe上的坐標(biāo))

    超簡單的java獲取鼠標(biāo)點(diǎn)擊位置坐標(biāo)的實(shí)例(鼠標(biāo)在Jframe上的坐標(biāo))

    在Java窗體Jframe上獲取鼠標(biāo)點(diǎn)擊的坐標(biāo),其中使用了匿名內(nèi)部類,實(shí)例代碼非常簡單易懂,大家可以學(xué)習(xí)一下
    2018-03-03
  • Java字符串轉(zhuǎn)時(shí)間簡單示例代碼

    Java字符串轉(zhuǎn)時(shí)間簡單示例代碼

    這篇文章主要給大家介紹了關(guān)于Java字符串轉(zhuǎn)時(shí)間的相關(guān)資料,在Java中字符和字符串常常需要相互轉(zhuǎn)化,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 一步步教你搭建Scala開發(fā)環(huán)境(非常詳細(xì)!)

    一步步教你搭建Scala開發(fā)環(huán)境(非常詳細(xì)!)

    Scala是一門基于jvm的函數(shù)式的面向?qū)ο缶幊陶Z言,擁有比java更加簡潔的語法,下面這篇文章主要給大家介紹了關(guān)于搭建Scala開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java中break、continue、return語句的使用區(qū)別對比

    Java中break、continue、return語句的使用區(qū)別對比

    這篇文章主要介紹了Java中break、continue、return語句的使用區(qū)別對比,本文用非常清爽簡明的語言總結(jié)了這三個(gè)關(guān)鍵字的使用技巧,并用一個(gè)實(shí)例對比使用結(jié)果,需要的朋友可以參考下
    2015-06-06
  • SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    這篇文章主要介紹了SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Jasypt對SpringBoot配置文件加密

    Jasypt對SpringBoot配置文件加密

    數(shù)據(jù)庫密碼直接明文寫在配置中,對安全來說,是一個(gè)很大的挑戰(zhàn)。一旦密碼泄漏,將會(huì)帶來很大的安全隱患。尤其在一些企業(yè)對安全性要求很高,因此我們就考慮如何對密碼進(jìn)行加密。本文著重介紹Jasypt對SpringBoot配置文件加密。
    2021-05-05
  • SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法

    SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法

    Quartz是一個(gè)定時(shí)任務(wù)框架,其他介紹網(wǎng)上也很詳盡。這里要介紹一下Quartz里的幾個(gè)非常核心的接口。通過實(shí)例代碼給大家講解SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法,感興趣的朋友一起看看吧
    2020-05-05
  • springboot如何實(shí)現(xiàn)自動(dòng)裝配源碼解讀

    springboot如何實(shí)現(xiàn)自動(dòng)裝配源碼解讀

    這篇文章主要介紹了springboot如何實(shí)現(xiàn)自動(dòng)裝配源碼賞析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)超級實(shí)用的日記本

    Java實(shí)現(xiàn)超級實(shí)用的日記本

    一個(gè)用Java語言編寫的,實(shí)現(xiàn)日記本的基本編輯功能、各篇日記之間的上下翻頁、查詢?nèi)沼泝?nèi)容的程序。全部代碼分享給大家,有需要的小伙伴參考下。
    2015-05-05
  • 關(guān)于文件上傳MultipartBody的使用方法

    關(guān)于文件上傳MultipartBody的使用方法

    這篇文章主要介紹了關(guān)于文件上傳MultipartBody的使用方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

乌拉特后旗| 方山县| 沂南县| 磐石市| 驻马店市| 江阴市| 曲周县| 万荣县| 邯郸县| 通河县| 东明县| 偏关县| 修文县| 哈巴河县| 文成县| 射阳县| 板桥市| 蒙山县| 古蔺县| 景东| 徐汇区| 绵竹市| 崇文区| 晋城| 互助| 太仆寺旗| 城市| 兴义市| 陕西省| 璧山县| 霍山县| 朝阳区| 莱州市| 调兵山市| 肥乡县| 新野县| 黑龙江省| 康平县| 修武县| 宜丰县| 古田县|