当前位置: 首页 > 科技观察

Java中列表分片的五种方法

时间:2023-03-13 05:22:19 科技观察

本文转载自微信公众号《Java中文社区》,作者雷哥。转载本文请联系Java中文社区公众号。前几天在实现MyBatis批量插入的时候遇到了一个问题。当批量插入的数据量比较大时,会报程序执行错误,如下图:原因是MySQL只能执行一定长度的SQL语句,但是当插入数据量大的时候很大,会产生很长的SQL,程序执行的时候会报错。解决这个问题有两种方法:一是设置MySQL可以执行的SQL的最大长度;第二,将一个大的List分成N个小的List。由于在程序中无法准确定义最大SQL长度,最优解是第二种,所以才有了今天这篇文章。简介将一个List划分成多个小List的过程称为分片。当然,也可以称之为“列表分离”。只需选择一个您喜欢且易于理解的名称即可。在Java中,分片的常见实现方式有:使用Google的Guava框架实现分片;使用Apache的commons框架实现分片;使用国产神级框架Hutool实现分片;使用JDK8提供Stream实现Sharding;自定义分片功能。接下来我们分别来看一下。1.GoogleGuava首先在项目的pom.xml中添加框架支持,添加如下配置:com.google.guavaguava31.0.1-jre有了Guava框架,只需要使用Lists.partition方法实现分区,如下代码所示:importcom.google.common.collect.Lists;importjava.util.Arrays;importjava.util.List;/***Guava分区*/publicclassPartitionByGuavaExample{//原始集合privatestaticfinalListOLD_LIST=Arrays.asList("唐僧、悟空、八戒、沙僧、曹操、刘备、孙权".split(","));publicstaticvoidmain(String[]args){//集合分片List>newList=Lists.partition(OLD_LIST,3);//打印分片集合newList.forEach(i->{System.out.println("collectionlength:"+i.size());});}}上述代码的执行结果如下图所示:2.apachecommons首先在项目的pom.xml中添加framework支持,并添加如下配置:org.apache.commonscommons-collections44.4有了commons框架,你只需要使用ListUtils.partition方法可以实现分片,如下代码所示:{//原始集合privatestaticfinalListOLD_LIST=Arrays.asList("唐僧、悟空、八戒、沙僧、曹操、刘备、孙权".split(","));publicstaticvoidmain(String[]args){//集合分片List>newList=ListUtils.partition(OLD_LIST,3);newList.forEach(i->{System.out.println("集合长度:"+i.size());});}}上面代码的执行结果如下图所示:3、Hutool首先在项目的pom.xml中添加framework支持,添加如下配置:cn.hutoolhutool-all<版本>5.7.14使用Hutool框架,只需要使用ListUtil.partition方法实现分区,如下代码:importcn.hutool.core.collection.ListUtil;importjava。效用。Arrays;importjava.util.List;publicclassPartitionByHutoolExample{//原始集合privatestaticfinalListOLD_LIST=Arrays.asList("唐僧、悟空、八戒、沙僧、曹操、刘备、孙权".split(","));publicstaticvoidmain(String[]args){//分片处理List>newList=ListUtil.partition(OLD_LIST,3);newList.forEach(i->{System.out.println("集合长度:"+i.size());});}}上述代码的执行结果如下图所示:4、JDKStream在JDK8中通过Stream实现分片,没有添加任何框架。具体实现代码如下:importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;/***JDKStreamPartition*/publicclassPartitionByStreamExample{//原始集合privatestaticfinalListOLD_LIST=Arrays.asList(1,2,3,4,5,6);publicstaticvoidmain(String[]args){//集合分片:将大于3和小于等于3的数据分成两组Map>newMap=OLD_LIST.stream().collect(Collectors.partitioningBy(i->i>3));//打印结果System.out.println(newMap);}}上面代码的执行结果如下图所示:这种方法的优点是不需要添加任何框架,缺点是只能实现简单的分片(将一个List一分为二),必须要有明确的分片条件。比如本例中设置的分片条件是数组是否大于3,大于3则分到一组,否则分到另一组。5.自定义sharding如果不想引入第三方框架,使用Stream不能满足需求,可以考虑自己写代码实现sharding功能。因为这个方法不常用,所以这里只给出关键的方法。自定义分片功能的关键实现方法是JDK自带的subList方法,如下图:使用示例如下:importjava.util.Arrays;importjava.util.List;publicclassApp{privatestaticfinalList_OLD_LIST=Arrays.asList("唐僧、悟空、八戒、沙僧、曹操、刘备、孙权".split(","));publicstaticvoidmain(String[]args){//集合分离Listlist=_OLD_LIST.subList(0,3);//打印集合中的元素list.forEach(i->{System.out.println(i);});}}上面代码的执行结果,如下图所示:总结本文介绍了5种List实现分片最方便的方法是引入第三方框架,比如Google的Guava,Apache的Commons,或者国内开源的Hutool。当然,如果你的项目已经包含了以上任何一个,直接使用就可以了。如果是简单的分片,可以考虑使用JDK的Stream或者List内置的subList方法来实现分片功能。