美文网首页
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

    list 分片 前言 前些天在实现 MyBatis 批量插入时遇到了一个问题,当批量插入的数据量比较大时,会导致程...

  • Python note_列表

    list函数 列表的基本操作 赋值 删除元素(del) 分片赋值 分片赋值的强大体现在它可以一次为列表中的多个元素...

  • Python学习手册 字符串

    补一下list复习的 字符串这一章 字符串可以进行分片 字符串不可以直接修改,通过分片或者replace间接修改,...

  • 相同需求使用foreach in sql嵌套完成实例

    需求:从steam_wd_order表中取出item_id(是个list),然后在表edu_course_seri...

  • Java List操作1(分片 partition)

    java中list 常用的操作大家都很熟悉了,有时候我们需要像在数据库中一样可以直接group by,select...

  • ShardingSphere官网及总结

    中文文档 分片 分片算法 精确分片算法 范围分片算法 复合分片算法 Hint分片算法 分片策略 标准分片策略 复合...

  • 日知录1-数据分片模型和路由算法

    分片模型: 先将数据映射到分片;再将分片映射到机器;都是多对一的关系。 分片策略:哈希分片和范围分片。 哈希分片通...

  • Python中str、list、numpy分片操作

    在Python里,像字符串(str)、列表(list)、元组(tupple)和这类序列类型都支持切片操作 对对象切...

  • MongoDB 集群

    分片群集 MongoDB分片群集由以下组件组成: 分片:每个分片包含分片数据。每个分片都可以部署为副本集。 mon...

  • number_of_shards的理解

    分片理论知识 分片数量总分片数=主分片数(副分片数+1)"settings": {"number_of_shard...

网友评论

      本文标题:list 分片-steam

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