使用Java8 Stream流的skip + limit实现批处理的方法

 更新时间:2022年07月05日 10:07:55   作者:南北12345678  
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念这篇文章主要介绍了使用Java8 Stream流的skip + limit实现批处理,需要的朋友可以参考下

为什么需要 Stream

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

什么是流

Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。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 的另外一大特点是,数据源本身可以是无限的。

1、一般进行批处理时会将数据加入到一个临时的集合中,当数据量达到一定大小后进行下一步操作,数据量不足时需要进行额外的判断;

2、若使用Java8的Stream流中的 skip + limit 则可以让我们对集合方便快捷的操作,其中:
(1)skip(x):返回丢弃流中的前x个元素后剩下元素组成的新流;若原流中包含的元素个数小于x,则返回空流。
(2)limit(x): 对一个Stream流进行截断操作,获取其前x个元素;若原流中包含的元素个数小于x,那就获取其所有的元素;

3、实例代码如下:

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);
        }
}

输出结果:

[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、通过结果也可以看出 skip 配合 limit 操作使用时, limit 是最多取出限制的大小,不用再判断最后一批数据量大小不够限定的大小时的处理。

改进版

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;
}

到此这篇关于使用Java8 Stream流的skip + limit实现批处理的文章就介绍到这了,更多相关Java8 Stream流批处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 超简单的java获取鼠标点击位置坐标的实例(鼠标在Jframe上的坐标)

    超简单的java获取鼠标点击位置坐标的实例(鼠标在Jframe上的坐标)

    在Java窗体Jframe上获取鼠标点击的坐标,其中使用了匿名内部类,实例代码非常简单易懂,大家可以学习一下
    2018-03-03
  • Java字符串转时间简单示例代码

    Java字符串转时间简单示例代码

    这篇文章主要给大家介绍了关于Java字符串转时间的相关资料,在Java中字符和字符串常常需要相互转化,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 一步步教你搭建Scala开发环境(非常详细!)

    一步步教你搭建Scala开发环境(非常详细!)

    Scala是一门基于jvm的函数式的面向对象编程语言,拥有比java更加简洁的语法,下面这篇文章主要给大家介绍了关于搭建Scala开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Java中break、continue、return语句的使用区别对比

    Java中break、continue、return语句的使用区别对比

    这篇文章主要介绍了Java中break、continue、return语句的使用区别对比,本文用非常清爽简明的语言总结了这三个关键字的使用技巧,并用一个实例对比使用结果,需要的朋友可以参考下
    2015-06-06
  • SpringSecurity登录使用JSON格式数据的方法

    SpringSecurity登录使用JSON格式数据的方法

    这篇文章主要介绍了SpringSecurity登录使用JSON格式数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Jasypt对SpringBoot配置文件加密

    Jasypt对SpringBoot配置文件加密

    数据库密码直接明文写在配置中,对安全来说,是一个很大的挑战。一旦密码泄漏,将会带来很大的安全隐患。尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密。本文着重介绍Jasypt对SpringBoot配置文件加密。
    2021-05-05
  • SpringBoot集成Quartz实现定时任务的方法

    SpringBoot集成Quartz实现定时任务的方法

    Quartz是一个定时任务框架,其他介绍网上也很详尽。这里要介绍一下Quartz里的几个非常核心的接口。通过实例代码给大家讲解SpringBoot集成Quartz实现定时任务的方法,感兴趣的朋友一起看看吧
    2020-05-05
  • springboot如何实现自动装配源码解读

    springboot如何实现自动装配源码解读

    这篇文章主要介绍了springboot如何实现自动装配源码赏析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java实现超级实用的日记本

    Java实现超级实用的日记本

    一个用Java语言编写的,实现日记本的基本编辑功能、各篇日记之间的上下翻页、查询日记内容的程序。全部代码分享给大家,有需要的小伙伴参考下。
    2015-05-05
  • 关于文件上传MultipartBody的使用方法

    关于文件上传MultipartBody的使用方法

    这篇文章主要介绍了关于文件上传MultipartBody的使用方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论