Java将List按指定大小分组;Lists.partition()的用法 3334次阅读 it 2021-07-12 有时候我们需要将数据按指定的长度分组,比如10w条数据分2000条一组更新数据库。如果不分组,一次性提交的sql过长铁定报错! ------------ ## 如何分组list? `Lists.partition(list, size)`就给了我们很方便分组方法~😁 第一个参数传需要分组的List;第二个参数是分组的大小,比如传2000,就是2000条一组 将会返回`List>` 😆 ## 引包 ``` import com.google.common.collect.Lists; ``` ### 测试类 ``` // 分组大小 Integer groupSize = 2000; // list长度:2048 List> groupList = Lists.partition(list, groupSize); for (List list2 : groupList) { log.info("第{}组List的长度: {}", index++, list2.size()); } ``` ### 测试结果 ``` 10:01:02.585 [main] INFO com.saver.my.core.Test.Test - 第1组List的长度: 2000 10:01:02.587 [main] INFO com.saver.my.core.Test.Test - 第2组List的长度: 48 ``` 当然也可以根据分割、循环等方法手动分组,但是感觉写法有点不美观,用这个工具类一行代码就可以解决的事~ 自己造轮子只有找不到工具或锻炼代码能力的时候才干😊 ## 例子 ### 新增 ``` /** * 分组保存日志信息 */ @Override public Integer saveLog(List logList) { if (CollectionUtils.isEmpty(logList)) { return 0; } // 分组大小 Integer groupSize = 2000; // 数据量小,直接插入 if (logList.size() < groupSize) { return busimagesMapper.saveLog(logList); } // 当数据大于分组,分组插入 List> removeList = Lists.partition(logList, groupSize); for (List list : removeList) { busimagesMapper.saveLog(list); } return logList.size(); } ``` ### 删除 因为传值全是id,所以分1w条一组 ``` /** * 逻辑删除image表 */ @Override public Integer softDeleteBusImages(List imageList) { if (CollectionUtils.isEmpty(imageList)) { return 0; } // 分组大小 Integer groupSize = 10000; // 直接逻辑删除 if (imageList.size() <= groupSize) { return busimagesMapper.softDeleteBusImages(imageList); } log.info("busImage 分组逻辑删除中... {} 条", imageList.size()); // 分组逻辑删除 List> partition = Lists.partition(imageList, groupSize); for (List list : partition) { busimagesMapper.softDeleteBusImages(list); } return imageList.size(); } ``` Alipay手机上阅读 最后一次更新于2021-07-20 None
Hutool包也有这个方法,看了下实现,大同小异。 能引一个包解决的问题,干嘛引其他包呢,嘻嘻😁
By 临轩 at 2022-3-9 11:33:52