Java 使用ListUtils对List分页处理

devtools/2024/9/25 8:23:17/

背景分析

  工作中,经常遇到需要用Java进行分页处理数据,例如把1000万条Excel数据写入MySQL数据库,如果把这1000w数据一股脑的丢给MySQL,保证把数据库玩完,故需要批量写入,如每批次写入500条。这时候就可以使用ListUtils.partition了。

maven坐标

  commons-collections4和Guava两个jar包的坐标如下:

java"><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version>
</dependency>
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version>
</dependency>

批处理List

基于commons-collections4和Guava两个jar包,对java.util.List中海量数据进行分批处理的逻辑如下所示,请求参数都是传入List和每页处理的数据量:

java">    public static void main(String[] args) {List<String> list =new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");list.add("Wiener");batchDealData(list, 3);batchDealByGuava(list, 3);}private static void batchDealData (List data, int batchNum) {// commons-collections4List<List<String>> partitions = ListUtils.partition(data, batchNum);partitions.stream().forEach(sublist -> {System.out.println(sublist);});}private static void batchDealByGuava (List data, int batchNum) {// guavaList<List<String>> partitions = Lists.partition(data, batchNum);partitions.stream().forEach(sublist -> {System.out.println(sublist);});}

  这种处理方法相对于手动分页,其优点显而易见,既可以降低代码复杂度,又可以提高开发效率。小编在《Java 使用线程池分批插入或者更新数据》中,介绍了一种通用分页方式,略显复杂,下面基于commons-collections4,优化其中的分页策略,代码如下:

java">private void batchDeal(List<Object> data, int batchNum) throws InterruptedException {if (CollectionUtils.isEmpty(data)) {return;}// 使用 ListUtils.partition分页List<List<Object>> newList = ListUtils.partition(data, batchNum);// 计算总页数int pageNum = newList.size(); ExecutorService executor = Executors.newFixedThreadPool(pageNum);try {CountDownLatch countDownLatch = new CountDownLatch(pageNum);for (int i = 0; i < pageNum; i++) {ImportTask task = new ImportTask(newList.get(i), countDownLatch);executor.execute(task);}countDownLatch.await();log.info("数据操作完成!可以在此开始其它业务");} finally {// 关闭线程池,释放资源executor.shutdown();}}// 无改动class ImportTask implements Runnable {private List list;private CountDownLatch countDownLatch;public ImportTask(List data, CountDownLatch countDownLatch) {this.list = data;this.countDownLatch = countDownLatch;}@Overridepublic void run() {if (null != list) {// 业务逻辑,例如批量insert或者updatelog.info("现在操作的数据是{}", list);}// 发出线程任务完成的信号countDownLatch.countDown();}}

整理自:https://www.cnblogs.com/east7/p/15876727.html


http://www.ppmy.cn/devtools/102637.html

相关文章

内网安全:跨域攻击

目录 获取域信息 利用域信任密钥获取目标域 利用krbtgt哈希值获取目标域 内网中的域林&#xff1a; 很多大型企业都拥有自己的内网&#xff0c;一般通过域林进行共享资源。根据不同职能区分的部门&#xff0c;从逻辑上以 主域和子域进行区分&#xff0c;以方便统一管理。在…

斯坦福大学cs231n (图像分类)

1.介绍 当作图像分类时&#xff0c;分类系统接收一些分类图像&#xff0c;比如猫咪。并且系统清楚了一些已经确定了分类或者标签的集合。那么&#xff0c;计算机的工作就是根据图片&#xff0c;给他分配一些固定的分类或者标签。 对于一个计算机来说&#xff0c;这是一个非常…

uniapp的uploadFile在APP端上传视频失败

问题 使用uniapp开发APP&#xff0c;在使用上传接口时&#xff0c;出现了后台提示没有上传文件&#xff0c;但H5正常 原因 uni.uploadFile({url: url,filePath: path,name: file,// APP必须要写&#xff0c;H5可以不写success: (res) > {} });原因就是name属性必须填写&a…

如祺出行发布首份中期业绩,总收入增长13.6%

8月28日&#xff0c;如祺出行发布2024年中期业绩公告。这是如祺出行于7月10日在港交所主板上市后发布的首份业绩公告。 业绩公告显示&#xff0c;2024年上半年如祺出行收入实现10.37亿元&#xff08;单位&#xff1a;人民币&#xff0c;下同&#xff09;、同比增长13.6%&#x…

代码随想录算法训练营第13天 |二叉树的学习

目录 二叉树 理论基础 二叉树的分类 1. 满二叉树 (Full Binary Tree) 2. 完全二叉树 (Complete Binary Tree) 3. 平衡二叉树 (Balanced Binary Tree) 5. 二叉搜索树 (Binary Search Tree, BST) 二叉树的存储 1. 链式存储 (Linked Representation) 2. 顺序存储 (Sequent…

Qt/QML学习-MenuBarToolBar

QML学习 MenuBar&ToolBar例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("MenuBar&ToolBar")// 菜单栏MenuBar {id: menuBarcontentWid…

深入理解DPO(Direct Preference Optimization)算法

目录 1. 什么是DPO&#xff1f;2. Bradley-Terry模型2.1 奖励模型的训练 3. 从PPO到DPO4. DPO的简单实现5. 梯度分析Ref 1. 什么是DPO&#xff1f; 直接偏好优化&#xff08;Direct Preference Optimization, DPO&#xff09;是一种不需要强化学习的对齐算法。由于去除了复杂的…

SAP ERP与长城汽车EDI业务集成案例(SAP CPI平台)

一、项目背景 某智能座舱公司是国内领先的智能座舱领域科技公司&#xff0c;致力于成为智能网联行业变革的领导者和推动者&#xff0c;聚焦整车域控制器产品、智能网联软件产品和运营服务产品&#xff1b; 已建成首条先进的数智化域控制器生产线&#xff0c;为客户提供最优…