写点什么

List 的拆分的几种方式

作者:EquatorCoco
  • 2023-06-30
    福建
  • 本文字数:1872 字

    阅读完需:约 6 分钟

开发中我们可能会遇到一个大的集合,然后我们需要对集合进行拆分,然后再对拆分的集合进行相关的操作。当然我们可以自己写一个拆分的方法,我自己写过用了不少代码,但是感觉还不是很好,最近看了不少工具才发现很多的大神们其实已经写了工具类,我们站在大神肩膀上开发就行了。


将 List 拆分很多的小的 List 的过程,我们称之为分片,当然也可以称为 List 的分隔,选一个你喜欢的名字就行,你喜欢的就是最好的(这怎么像渣男语录啊,一定要擦亮眼睛,不要让别人画大饼)。


在 Java 中分片的常见实现方法有以下几种:


1:使用 Google 的 Guava 框架实现切片。

2:使用 Apache 的 commons 框架实现切片。

3:使用 Hutool 工具类实现切片。


接下来我们就分别看一下,你的项目中如果已经引用了相应的 jar 包你就可以使用相应的方法实现 List 切片。


1.Google Guava


先在项目的 pom.xml 中添加框架支持,增加以下配置:


<dependency>            <groupId>com.google.guava</groupId>            <artifactId>guava</artifactId>            <version>31.0.1-jre</version>        </dependency>
复制代码


有了 Guava 框架之后,只需要使用 Lists.partition 方法即可实现分片,如下代码所示:


List<String> tempList = Arrays.asList("水星","金星","地球","火星","冥王星","土星","天王星","海王星","冥王星","木星");// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition = Lists.partition(tempList, 3);System.out.println(partition);
复制代码


结果如下:(拆成如下结果,开发的时候再遍历集合进行应用)


[[水星, 金星, 地球], [火星, 冥王星, 土星], [天王星, 海王星, 冥王星], [木星]]
复制代码


2.apache commons


先在项目的 pom.xml 中添加框架支持,增加以下配置:


<dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-collections4</artifactId>            <version>4.4</version>        </dependency>
复制代码


有了  commons 框架之后,只需要使用 ListUtils.partition 方法即可实现分片,如下代码所示:


List<String> tempList = Arrays.asList("水星","金星","地球","火星","冥王星","土星","天王星","海王星","冥王星","木星");List<List<String>> partition = ListUtils.partition(tempList, 6);
System.out.println(partition);
复制代码


输出结果如下:


[[水星, 金星, 地球, 火星, 冥王星, 土星], [天王星, 海王星, 冥王星, 木星]]
复制代码


3.Hutool


先在项目的 pom.xml 中添加框架支持,增加以下配置:


<dependency>            <groupId>cn.hutool</groupId>            <artifactId>hutool-all</artifactId>            <version>5.7.14</version>        </dependency>
复制代码


有了 Hutool 框架之后,只需要使用 ListUtil.partition 方法即可实现分片,如下代码所示:


List<String> tempList = Arrays.asList("水星","金星","地球","火星","冥王星","土星","天王星","海王星","冥王星","木星"); List<List<String>> partition = ListUtil.partition(tempList, 5);
System.out.println(partition);
复制代码


输出结果如下:


[[水星, 金星, 地球, 火星, 冥王星], [土星, 天王星, 海王星, 冥王星, 木星]]
复制代码


有的小伙伴可能会说,为什么要给出三种的,给出一种切片方法不就可以了,因为列举每一种方法都需要引入对应的 jar 包,所以自己按需引用,如果你的项目中已经引用了对应的 jar 就参考其中的一个例子写就行了。


又有小伙伴要问这样切分有什么用途呢?这个用途还是很广泛的,比如你做批量新增数据的时候,如果你有几万条数据要新增到数据库,最好对这几万条数据拆分一下再插入数据库,例如 ORACLE 你如果一次批量新增超过 1000 条就有可能会新增失败。Mysql 批量新增一次过多也可能回报如下


com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16888937 > 1048576). 

You can change this value on the server by setting the max_allowed_packet' variable.


这种错误,当然这种错误可以通过设置如下参数解决:


SET GLOBAL max_allowed_packet = 1024*1024*64


但是你不能把这个参数设置无限大,设置无限大也是不好的。所以批量新增大量数据最好拆分一下。


【PS 其实我上面引用的那些 jar 包,每个包里面都有很多工具类供开发者使用,并且都是经过大量实践的,性能也是很好的小伙伴们可以引入对应的 jar 看看各个工具类的源码真的是太好用了】,欢迎关注,感谢关注。


文章转载自:程序员xiaozhang

原文链接:https://www.cnblogs.com/scott1102/p/17445731.html


用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
List的拆分的几种方式_前端_EquatorCoco_InfoQ写作社区