尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

List分片的5种方法

List分片的5种方法 前言当使用mybatis实现批量插入时遇到一个问题当要插入的数据量很大时就会产生一个很长的SQL但是MySQL有一个限制最大长度所以解决这个问题。解决这个问题有两个1、设置mysql的最大长度2、对数据进行分片也就是对list分片。我们不是很清楚mysql最大的长度那么使用第二种就是我们最优的解决方案了。使用 Google 的 Guava 框架实现分片首先在pom文件中导入依赖dependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion31.0.1-jre/version/dependency有了Guava 框架后就可以使用 Lists.partition 方法即可实现分片importcom.google.common.collect.Lists;importjava.util.Arrays;importjava.util.List;/** 1. Guava 分片 */publicclassPartitionByGuavaExample{// 原集合privatestaticfinalListStringOLD_LISTArrays.asList(1,2,3,4,5,6,7.split(,));publicstaticvoidmain(String[]args){// 集合分片ListListStringnewListLists.partition(OLD_LIST,3);// 打印分片集合newList.forEach(i-{System.out.println(集合长度i.size());});}}打印的结果使用 Apache 的 commons 框架实现分片首先导入依赖支持commonsdependencygroupIdorg.apache.commons/groupIdartifactIdcommons-collections4/artifactIdversion4.4/version/dependency项目支持commons后我们可以使用ListUtils.partition 即可实现分片importorg.apache.commons.collections4.ListUtils;importjava.util.Arrays;importjava.util.List;/** * commons.collections4 集合分片 */publicclassPartitionExample{// 原集合privatestaticfinalListStringOLD_LISTArrays.asList(1,2,3,4,5,6,7.split(,));publicstaticvoidmain(String[]args){// 集合分片ListListStringnewListListUtils.partition(OLD_LIST,3);newList.forEach(i-{System.out.println(集合长度i.size());});}}~~~执行结果如下![在这里插入图片描述](https://img-blog.csdnimg.cn/ec7f3bd86d614f0cb413bbee4e9cd954.png?x-oss-processimage/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5biFNDI3NjEyNzc,size_20,color_FFFFFF,t_70,g_se,x_16)3.使用国产神级框架Hutool实现分片 先在项目的 pom.xml 中添加框架支持增加以下配置:~~~xmldependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.7.14/version/dependency~~~有了Hutool框架之后只需要使用ListUtil.partition 方法即可实现分片如下代码所示:~~~javaimportcn.hutool.core.collection.ListUtil;importjava.util.Arrays;importjava.util.List;publicclassPartitionByHutoolExample{// 原集合privatestaticfinalListStringOLD_LISTArrays.asList(1,2,3,4,5,6,7.split(,));publicstaticvoidmain(String[]args){// 分片处理ListListStringnewListListUtil.partition(OLD_LIST,3);newList.forEach(i-{System.out.println(集合长度i.size());});}}以上代码的执行结果如下图所示使用 JDK 8 中提供 Stream 实现分片Stream 通过 JDK 8 中的 Stream 来实现分片就无需添加任何框架了具体的实现代码如下importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;/** * JDK Stream Partition */publicclassPartitionByStreamExample{// 原集合privatestaticfinalListIntegerOLD_LISTArrays.asList(1,2,3,4,5,6);publicstaticvoidmain(String[]args){// 集合分片将大于 3 和小于等于 3 的数据分别分为两组MapBoolean,ListIntegernewMapOLD_LIST.stream().collect(Collectors.partitioningBy(i-i3));// 打印结果System.out.println(newMap);}}此方式的优点的无需添加任何框架但缺点是只能实现简单的分片将一个 List 分为两个并且要有明确的分片条件。比如本篇案例中设置的分片条件就是数组是否大于 3如果大于 3 就会被归为一组否则就会被分到另一组。6. 自定义分片功能自定义分片功能的关键实现方法是 JDK 自带的 subList 方法
返回列表