java8 stream并发处理分批操作

java8 Stream 大数据量List分批处理 java8 Stream 大数据量List分批处理 //一次500条 int applyIdSelectSize = 500; int limit = (paperNoList.size() + applyIdSelectSize - 1) / applyIdSelectSize; //分成limit次发请求到数据库,i... 阅读详情

使用场景:

查询数据量很大的时候需要分批查询

在不并发操作的情况下,假设数据总量为 10万,每次查询500条数据,每次查询耗时100ms,则总耗时最少要20s,这样是相当慢的

 

使用java8的stream可以多线程查询数据

两者耗时对比如下

​
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @desc  java8 流的方式并发处理分批操作
 * @date 2021/1/6
 */
public class ParallelTest {
    public static void main(String[] args) {

        //业务数据
        List<String>  dataList=new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            dataList.add(i+"");
        }
        int num=500;
        long startTime = System.currentTimeMillis();
        List<String> result=new ArrayList<>();
        try {
            result = Stream.iterate(0, i -> i + 1).limit(dataList.size() / num + 1).parallel().map(i -> {
                //获取每一批的数据
                List<String> perList = dataList.parallelStream().skip(i * num)
                        .limit(num)
                        .collect(Collectors.toList());
                //业务处理
              return   queryThisData(perList,i);
            }).filter(o -> Objects.nonNull(o))
                    .flatMap(Collection::parallelStream)
                    .collect(Collectors.toList());
        } catch (Exception e) {
            e.printStackTrace();
        }

        long endTime = System.currentTimeMillis();
        System.out.println("并发批量处理耗时:"+(endTime-startTime)+" 数据总数:"+result.size());

        //不并发分批
        List<String> result2=new ArrayList<>();
        List<List<String>> parList=new ArrayList<>();
        int size = dataList.size() % num == 0 ? (dataList.size() / num) : (dataList.size() / num + 1);
        for (int i = 0; i < size ; i++) {
            List<String> list=new ArrayList<>();
              for (int j=i*num;j<num*(i+1);j++){
                  list.add(dataList.get(j));
              }
            parList.add(list);
        }
        for (int i = 0; i < parList.size(); i++) {
            result2.addAll(queryThisData(parList.get(i),i));
        }
        System.out.println("不并发批量处理耗时:"+(System.currentTimeMillis()-endTime)+" 数据总数:"+result2.size());

    }

    private static List<String> queryThisData(List<String> perList,int i) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return perList;
    }

}

​

输出结果:

并发批量处理耗时:2784 数据总数:100000
不并发批量处理耗时:20122 数据总数:100000

也可以用ExecutorService实现

两者性能比较参考:

https://www.cnblogs.com/metoy/p/4323910.html

 

java8 Stream API java stream Java 8 java.util.stream Stream API的中间操作有filter、map、distinct、sorted、skip、limit、peek、mapToLong、mapToInt、mapToDouble、flatMap等 Stream API的终端操作有collect、max、min、count、allMatch、anyMatch、noneMatch、findFirst、findAny、forEach、toArray、reduce等。 阅读详情

相关推荐

故障排查:OpenClaw 更新后 feishu 插件路径失效的解决方法

OpenClaw 更新后 feishu 插件路径失效的解决方法发现问题→ Gateway 启动失败,报插件路径错误定位原因→ OpenClaw 目录结构变化,→解决问题→ 更新为正确的路径验证修复→ 使用确认一切正常。

刘一说的IT专栏 1305

ipage中limit中传入的是600条查出500条_java 8 stream 中 Spliterator 使用,开发利器!...

作者:flydean 链接:https://juejin.im/post/5ea4ca3ae51d4546bb6f63c7简介Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列。只要用到stream的地方都需要Spliterator,比如List,Collection,IO channel等等。我们先看一下Collection中stream方法的...

weixin_35089515的博客 1032

VR大空间开发前期,设备选项与流程

欢迎开发者加入 VR 大空间开发之旅!本系列教程将以 Pico 和 HTC 设备为核心,系统拆解从基础搭建到功能实现的全流程,助你快速掌握开发要点。本系列共 12 篇,专为有编程基础但缺乏大空间开发经验的开发者设计。前 7 篇针对 Pico 和 HTC 设备差异分别讲解,后续步骤通用。核心目录如下:​1. 空间环境要求 - 灯光设置 - 场地面积规划 - 识别图案设计2. 网络部署方案3. 客户端体验模式解析 - 一体机模式 - 云渲染模式 - 背包体验模式4. Pico空间录制方法

unitygroup的博客 1354

Stream流切割N个List

public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); int limit = countStep(list.size()); //方法一:使用流遍历操作 List<List<Integer>> mglist = new ArrayList<>(); Stream.iterate(.

李静静 2402

MTEX包在Matlab中实现从EBSD数据生成Abaqus网格与晶粒取向:一种对用户材料旋转矩阵分量实践的全面指南

此教程提供了一种使用MTEX Matlab包处理EBSD数据的方法,并生成Abaqus输入文件,这对于进行多晶体有限元分析具有极大的帮助。但值得注意的是,这只是一个基本的例子,实际应用中可能需要根据您的实际需求进行调整。MTEX包还提供了许多其他的功能,可以进行更复杂的分析和处理,我非常推荐您去探索。希望这篇文章能对您有所帮助,如果您有任何疑问或建议,欢迎留言交流。在接下来的文章中,我将会介绍更多关于MTEX的高级功能,敬请期待。– (完)–

qq_38334677的博客 4437

【华为OD技术面试手撕真题】134、爬楼梯 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

【华为OD技术面试手撕真题】134、爬楼梯 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何

KJ.JK 2184

数据量大时,采用stream流进行分批操作

数据量大时采用Stream流操作进行分批操作

m0_61716416的博客 612

SAP_MM模块采购订单显示含税价&不含税简介

不含税价(Net Price):基础商品价格,不包含税金。含税价(Gross Price):基础价格加上适用税金后的总价。在SAP中,采购订单通常以不含税价为基础,通过配置税码和定价方案,系统会自动计算含税总价。

我小时候很黑的博客 2303

java8 Stream 大数据量List分批处理切割

【代码】java8 Stream 大数据量List分批处理切割。

weixin_55645622的博客 1313

深度剖析:Spring AI 与 LangChain4j,谁才是 Java 程序员的 AI 开发利器?

首先介绍 AI 时代 Java 开发框架选择背景,接着对比两者功能特性(Spring AI 的生态集成与标准化设计、LangChain4j 的多模型适配与提示工程)、应用场景(企业级系统改造与创新产品开发)、开发体验(学习成本与调试工具)、生态扩展(Spring 商业支持与 LangChain4j 开源社区)、性能安全(企业级优化与自主安全实现)及成本趋势(短期投入、长期回报与技术演进),最后给出选型建议与混合架构方案。

博客 5445

Ubuntu系统下MRIcroN、FSL6.0.5、Freesurfer7.1.1、ANTs、MRtrix3、AFNI的安装详解——核磁共振数据处理必备

Ubuntu系统下MRIcroN、FSL6.05、Freesurfer7.1.1、MRtrix3、AFNI、ANTs的安装详解一、安装MRIcroN二、 FSL6.0.5完整安装与FSLeyes等Not Found修复Anaconda与虚拟环境(所有操作均在root下)获取最新版Anaconda3安装Anaconda3配置所有用户可用去掉恼人的base创建虚拟环境FSL与FSLeyes安装(所有操作均在root下)下载FSL安装FSL添加环境变量到/etc/bash.bashrc末尾 (ubuntu)或者

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 6085

玩转Java8 Stream流

Java8中Stream流总结 因为在工作后,发现项目代码里经常会出现Stream流以及和lambda表达式联合使用。但之前对于这块的学习有点一知半解,所以花了几天空闲时间将这些知识总结一下。 一、概述 **(参考百度)**Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Str

weixin_41938314的博客 9595

Nexys4DDR+OV7670实现图像灰度显示系统嵌入式

通过对硬件平台的准备、Vivado工程配置、OV7670驱动程序的编写、图像灰度处理算法的设计以及系统集成与测试,我们成功实现了一个基于嵌入式系统的图像处理应用。当系统运行时,OV7670摄像头模块将采集到的图像传输到FPGA芯片中,然后通过图像灰度处理算法将彩色图像转换为黑白图像,并在显示设备上进行显示。OV7670摄像头模块的驱动程序是实现图像采集的核心。以上代码中,我们使用了Xilinx提供的XGpio和Xil_In32函数来进行OV7670摄像头数据的读取和GPIO的初始化。OV7670驱动程序。

WangWEel的博客 338

Java8 Stream

简单认识Java stream Java8出了一个stream流式编程,在开发中或多或少用到接触过。怎么说呢!举个例子把,一起我们在遍历一个集合的时候,我们是从外部去遍历的,然后才能拿到结果,这样来效率就会变得相对低一点。而这个时候我们去内部去遍历集合的时候,直接从内部拿数据。减少资源消耗,提升效率。 什么是stream呢? Stream它并不是一个容器,它只是对容器的功能进行了增强,添加了很多便利的操作,例如查找、过滤、分组、排序等一系列的操作。并且有串行、并行两种执行模式,并行模式充分的利用了多核处理器

weixin_43298696的博客 5736

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 8 Stream

介绍了java 8 Stream的基本概念、创建方式、常用API以及Collectors收集器等知识

weixin_42108602的博客 1725

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java8学习总结——Stream的理解

Stream初理解     JAVA8中一个重要概念就是流——stream。先来看看流的使用: public class StreamTest01 { public static void main(String[] args) { Stream stream = Stream.of(1,2,3,4); stream.map(i -> i+1).fo

qq_36372507的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java8 Stream流

目录 前言 一.stream的使用场景特点 特点: 二.初步体验一下stream 三.简单看一下Stream的常用API 3.1 forEach()遍历集合中的对象 3.2filter对流对象进行过滤 3.3map()方法: 3.4count():计数 3.5 limit():选取流数据的前多少条数据 3.6 skip():跳转 3.7 concat():合并 四.总结: 4.1stream的实际开发好处 4.2stream应用中的不足 前言 今天我们主要对于str..

m0_61682705的博客 7593

JAVA 8 新特性Stream API

JAVA 8 新特性Stream API(三)

分享我的点点滴滴,在成长路上与你同行! 1135

Java 8之Stream适用场景

Stream是Java 8中的一个大的改进。Stream的功能是,支持集合的各种操作,比如filter, sum, max, min, average, map, reduce等等。所以我个人认为Stream的出现是基于以下原因: 增强集合操作 拥抱函数式编程 充分利用Lambda 执行效率的提高 - 透明支持多线程集合操作 笔者尝试测试一下Stream并发处理的威力,发现面对特别简单的任务,Str

永无止境,上下求索 2万+

java8 stream index_Java8 Stream基本使用

1. 什么是StreamStream是一个数据处理接口,本身不存储任何数据。大概有20多个方法,每个都很好用,并且含有函数式编程里的filter,map,reduce方法。Stream的数据有三个来源:Collection, Array或者根据需要生成。2. 创建Stream在Java8中,添加了许多能够产生Stream的方法,如Pattern类中的splitAsStream方法,下面是三种典型常...

weixin_36131782的博客 2644

Java Stream + CompletableFuture 异步并发处理集合最佳实践

本文系统介绍了 Java Stream + CompletableFuture 并发处理集合的技术方案,从设计思想、流程结构、核心源码、优缺点、业务场景、调试优化、技术栈集成到底层原理,形成了完整的技术认知闭环。该模式不仅提升了系统吞吐量与响应速度,更为业务系统的可扩展性与架构演进奠定了坚实基础。建议在高并发、批量数据处理场景下重点采用,并结合实际业务持续优化。知其然,更知其所以然——只有理解底层原理与架构演进,才能在技术洪流中立于不败之地。

IT技术学习与工作笔记分享 938

关于java8的stream循环

JAVA8stream循环非常强大 首先,相对于传统的循环,java8的循环做了升级,而且代码更加简洁。 举例: List list = orgEvaluateItemRepository.findAll(userId); 现有一个list对象集合(里面有name,age属性等)。 1.//现将这个list对象集合转化成属性是name的值的集合 List<String> names= ...

AlphaBoss的博客 2784

Java8-Stream

概述 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行...

记录日常的点点滴滴 1287

Java8 Stream详解

Java8 Stream1 Stream概述2 Stream的创建3 Stream的使用案例使用的员工类3.1 遍历/匹配(foreach/find/match)3.2 筛选(filter)3.3 聚合(max/min/count)3.4 映射(map/flatMap)3.5 归约(reduce)3.6 收集(collect) 1 Stream概述 Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。 那

琪丶琪的博客 1597

Java8 | 关于Stream

一、关于Stream Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简言之,Stream API 提供了一种高效且易于使用的处理数据的方式 二、什么是Stream Str...

NULL的博客 2028

java8中Stream的使用以及分割list

一、Steam的优势 java8中Stream配合Lambda表达式极大提高了编程效率,代码简洁易懂(可能刚接触的人会觉得晦涩难懂),不需要写传统的多线程代码就能写出高性能的并发程序 二、项目中遇到的问题 由于微信接口限制,每次导入code只能100个,所以需要分割list。但是由于code数量可能很大,这样执行效率就会很低。 1.首先想到是用多线程写传统并行程序,但是博主不是很熟练,写出代码可能会出现不可预料的结果,容易出错也难以维护。 2.然后就想到Steam中的parallel,能提高性能.

竹林幽深 1169
上一篇: dubbo提供者抛出异常的父类,消费者无法获取到实际异常类型的问题,由ExceptionFilter导致
下一篇: mybatisplus无主键表insert出现Class must not null报错
codelady
博客等级 码龄11年 26粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值