Java 使用ListUtils对List分页处理
背景分析
工作中,经常遇到需要用Java进行分页处理数据,例如把1000万条Excel数据写入MySQL数据库,如果把这1000w数据一股脑的丢给MySQL,保证把数据库玩完,故需要批量写入,如每批次写入500条。这时候就可以使用ListUtils.partition了。
maven坐标
commons-collections4和Guava两个jar包的坐标如下:
<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和每页处理的数据量:
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-collections4
List<List<String>> partitions = ListUtils.partition(data, batchNum);
partitions.stream().forEach(sublist -> {
System.out.println(sublist);
});
}
private static void batchDealByGuava (List data, int batchNum) {
// guava
List<List<String>> partitions = Lists.partition(data, batchNum);
partitions.stream().forEach(sublist -> {
System.out.println(sublist);
});
}
这种处理方法相对于手动分页,其优点显而易见,既可以降低代码复杂度,又可以提高开发效率。小编在《Java 使用线程池分批插入或者更新数据》中,介绍了一种通用分页方式,略显复杂,下面基于commons-collections4,优化其中的分页策略,代码如下:
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;
}
@Override
public void run() {
if (null != list) {
// 业务逻辑,例如批量insert或者update
log.info("现在操作的数据是{}", list);
}
// 发出线程任务完成的信号
countDownLatch.countDown();
}
}
小结
你如果对于如何分页不熟练,使用如上分页技术进行处理,是不是很简单?如果你有更轻巧的方法,欢迎留言评论。
Java 使用ListUtils对List分页处理的更多相关文章
- 第83节:Java中的学生管理系统分页功能
第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...
- java oracle的2种分页方法
java oracle的2种分页方法 一物理分页: <!-- 分页查询所有的博客信息 --> <select id="findBlogs" resultType= ...
- JAVA WEB 用servlet实现分页,思路比较清晰和简单。
JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...
- Java代码实现 增删查 + 分页——实习第四天
今天项目内容已经开始了,并且已经完成好多基本操作,今天就开始总结今天学习到的内容,和我遇到的问题,以及分析这其中的原因. 内容模块: 1:Java代码实现对数据库的增删查: 2:分页且获取页面信息: ...
- JDBC在Java Web中的应用——分页查询
分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现 ...
- Java项目之查询后分页
一.Jsp页面: <%@ page language="java" contentType="text/html; charset=UTF-8" page ...
- Java项目开发中实现分页的三种方式一篇包会
前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...
- Java项目中基于Hibernate分页总结
1,First of all, we should have a wrapper class for page,this class can calculate the startRow by th ...
- java web 前端页面的分页逻辑
<div class="divBody"> <div class="divContent"> <!--上一页 --> < ...
- 关于Java中List对象的分页思想,按10个或者n个数对list进行分组
try { List<String> timelist = DateUtils.getDateListBySETime("2015-08-01", "2015 ...
随机推荐
- manim边学边做--场景Scene简介
在 Manim 社区版本中,Scene(场景)是构建动画的核心概念之一,它为我们提供了一个结构化的方式来组织和呈现动画内容. 本文将介绍什么是Scene,它在Manim动画中的作用,以及不同类型的Sc ...
- wangeditor编辑器
官网 https://www.wangeditor.com/ 在线体验DEMO https://codepen.io/xiaokyo-the-bold/pen/ZEpWByR
- 记录composer 安装 yii2项目
先带上一个痛苦面具 前段时间换成mac系统,自己以前的yii2项目老是安装不上,因为暂时用不上就没去管,现在想用了,折腾了半天才安装好.下面我记录下坑 国内记得换镜像(我换了系统后,应该是忘记了) c ...
- SpringBoot+Hutool 文件导出Excel
Hutool-poi是针对Apache POI的封装,因此需要用户自行引入POI库,Hutool默认不引入.到目前为止,Hutool-poi支持: Excel文件(xls, xlsx)的读取(Exce ...
- dxTabbedMDIManager1关闭窗体
procedure TfrmJianKongXinXi.FormClose(Sender: TObject; var Action: TCloseAction);begin Action:=caFre ...
- RMQ 和 LCA 问题
# Part 1 RMQ RMQ,即区间信息维护问题 如最大值,最小值,GCD 等 RMQ 算法实现很多 具体有线段树,树状数组和 ST 表 但综合时间复杂度最好的是 ST 表 查询 O(1),预处理 ...
- 【Python】面向对象版学员管理系统
面向对象版学员管理系统 一. 系统需求 使用面向对象编程思想完成学员管理系统的开发,具体如下: 系统要求:学员数据存储在文件中 系统功能:添加学员.删除学员.修改学员信息.查询学员信息.显示所有学员信 ...
- 【C语言】Linux 飞翔的小鸟
[C语言]Linux 飞翔的小鸟 零.环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev 壹.编写代码 代码如下: bird.c #include ...
- MySQL 修复损坏表
修复MySQL损坏表的简单步骤,不一定适用任意情况下的表损坏的问题,留爪. 简单3步曲: # 用`root`用户登录MySQL # 这里可能需要输入密码 mysql -uroot -p # 使用指定数 ...
- 要命的DRG成本核算!
改开几十年的三座大山之一,鬼见愁的问题.会随着DRG的推进而让平头老百姓过上翻身做主的日子呢!? 对于DRG,首先医保部门需要了解病种成本状况,确定给你结算多少银子.第二,咱们医院靠医保吃饭,那就更需 ...