美文网首页
list 分片-steam

list 分片-steam

作者: Raral | 来源:发表于2021-11-25 10:23 被阅读0次

    list 分片

    前言

    前些天在实现 MyBatis 批量插入时遇到了一个问题,当批量插入的数据量比较大时,会导致程序执行报错,如下图所示:
    原因是 MySQL 只能执行一定长度的 SQL 语句,但当插入的数据量较多时,会生成一条很长的 SQL,这样程序在执行时就会报错。

    要解决这个问题,有两种方法:第一,设置 MySQL 可以执行 SQL 的最大长度;第二,将一个大 List 分成 N 个小 List 进行。由于无法准确的界定程序中最大的 SQL 长度,所以最优的解决方案还是第二种,于是就有了今天的这篇文章。

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

    • 使用 Google 的 Guava 框架实现分片;
    • 使用 Apache 的 commons 框架实现分片;
    • 使用国产神级框架 Hutool 实现分片;
    • 使用 JDK 8 中提供 Stream 实现分片;
    • 自定义分片功能。
    1. 使用 Google 的 Guava 框架实现分片;
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>31.0.1-jre</version>
    </dependency>
    
    import com.google.common.collect.Lists;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * Guava 分片
     */
    public class PartitionByGuavaExample {
        // 原集合
        private static final List<String> OLD_LIST = Arrays.asList(
                "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
    
        public static void main(String[] args) {
            // 集合分片
            List<List<String>> newList = Lists.partition(OLD_LIST, 3);
            // 打印分片集合
            newList.forEach(i -> {
                System.out.println("集合长度:" + i.size());
            });
        }
    }
    
    //集合长度: 3
    //集合长度: 3
    //集合长度: 1
    
    1. 使用 Apache 的 commons 框架实现分片;
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-collections4</artifactId>
      <version>4.4</version>
    </dependency>
    
    import org.apache.commons.collections4.ListUtils;
    
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * commons.collections4 集合分片
     */
    public class PartitionExample {
        // 原集合
        private static final List<String> OLD_LIST = Arrays.asList(
                "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
    
        public static void main(String[] args) {
            // 集合分片
            List<List<String>> newList = ListUtils.partition(OLD_LIST, 3);
            newList.forEach(i -> {
                System.out.println("集合长度:" + i.size());
            });
        }
    }
    
    
    1. 使用国产神级框架 Hutool 实现分片;
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.7.14</version>
    </dependency>
    有了 Hutool 框架之后,只需要使用 ListUtil.partition 方法即可实现分片,如下代码所示:
    
    import cn.hutool.core.collection.ListUtil;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class PartitionByHutoolExample {
        // 原集合
        private static final List<String> OLD_LIST = Arrays.asList(
                "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
    
        public static void main(String[] args) {
            // 分片处理
            List<List<String>> newList = ListUtil.partition(OLD_LIST, 3);
            newList.forEach(i -> {
                System.out.println("集合长度:" + i.size());
            });
        }
    }
    
    1. 使用 JDK 8 中提供 Stream 实现分片;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    /**
     * JDK Stream Partition
     */
    public class PartitionByStreamExample {
        // 原集合
        private static final List<Integer> OLD_LIST = Arrays.asList(
                1, 2, 3, 4, 5, 6);
    
        public static void main(String[] args) {
            // 集合分片:将大于 3 和小于等于 3 的数据分别分为两组
            Map<Boolean, List<Integer>> newMap = OLD_LIST.stream().collect(
                    Collectors.partitioningBy(i -> i > 3)
            );
            // 打印结果
            System.out.println(newMap);
        }
    }
    
    1. 自定义
    import java.util.Arrays;
    import java.util.List;
    
    public class App {
        private static final List<String> _OLD_LIST = Arrays.asList(
                "唐僧,悟空,八戒,沙僧,曹操,刘备,孙权".split(","));
    
        public static void main(String[] args) {
            // 集合分隔
            List<String> list = _OLD_LIST.subList(0, 3);
            // 打印集合中的元素
            list.forEach(i -> {
                System.out.println(i);
            });
        }
    }
    

    相关文章

      网友评论

          本文标题:list 分片-steam

          本文链接:https://www.haomeiwen.com/subject/iweatrtx.html