Java List分批处理

工作中经常遇到分批处理的问题,比如将一个List列表中的数据分批次保存至数据库中。如果列表中数据条目很大,比如1000万条以上,mysql中 max_allowed_packet 所能允许的最大数据包量不支持如此大的数据量,这种情况下一次性保存处理就会出现保存失败。另外,过大的数据条目数量,在保存时也会导致性能下降。为此手动批量处置就成为了一种必须。这里给出分批处理的代码,方便以后直接使用。

package com.lunyu.algorithm.service.base;

import com.google.common.collect.Lists;
import java.util.List;

/**
 * @author lunyu
 * @since 2021/1/25
 */
public class BaseService {

  /**
   * 每个批次数据条目
   */
  private static final int BATCH_SIZE = 10;

  public static void main(String[] args){

    List list = Lists.newArrayList();
    for (int i = 0; i < 23; i++){
      list.add(i + 1);
    }

    // 获取执行的轮次
    int round = (list.size() - 1) / BATCH_SIZE;

    for (int i = 0; i ){
      // 求每个批次起始位置
      int fromIndex = i * BATCH_SIZE;
      int toIndex = (i + 1) * BATCH_SIZE;
      // 如果是最后一个批次,则不能越界
      if (i == round){
        toIndex = list.size();
      }

      List subList = list.subList(fromIndex, toIndex);

      // TODO: 对subList执行进一步要做的操作
      System.out.println("轮次:" + i);
      subList.forEach(e -> {
        System.out.print(e + ",");
      });
      System.out.println();
    }
  }

}

这里有三个个注意的点,

第一, 获取轮次使用 (list.size() – 1) / BATCH_SIZE ,这是为了方便将属于同一个批次的数据同属该批次。以代码为例,如果恰好有10个元素 1-10 (对应的坐标点 0-9 ),我们要把它们放置在同一个批次下, BATCH_SIZE = 10; ,那么 list.size() – 1 = 9 ,恰好可以使最后一个元素和前面所有的元素都在一个批次下,这个批次等于 0。

第二,循环的轮次为 i

第三, if (i == round) ,要保证最后一个批次的数据,在获取时不能数组越界。为了代码美观, toIndex 可以用三元表达式统一起来,写做:

int toIndex = (i < round) ? ((i + 1) * BATCH_SIZE) : list.size();

搜索

复制

Original: https://www.cnblogs.com/lunyu/p/14328171.html
Author: 论语
Title: Java List分批处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611507/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一条SQL更新语句是如何执行的

    文章首发于公众号「蝉沐风」,认真写好每一篇文章,欢迎大家关注交流 这是图解MySQL的第2篇文章,这篇文章会通过 一条SQL更新语句的执行流程让大家清楚地明白: 什么是InnoDB…

    数据库 2023年5月24日
    097
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 """ 1.&#x9996;&#x5148;&#x9700;&#x8981;&amp…

    数据库 2023年6月14日
    068
  • 上传jar包到私有仓库nexus3

    上传Jar包到私有仓库Nexus3 官方文档 上传组件(Jar包) POST /service/rest/v1/components 官方例子: curl -v -u admin:…

    数据库 2023年6月9日
    073
  • 自然语言处理NLP与深度学习(学习笔记)

    自然语言处理NLP与深度学习(学习笔记) 字母转有声调的字母 Jieba词性标注集 a 形容词 ad 副形词 an 名形词 ag 形容词性语素 al 形容词性惯用语 区别词(1个一…

    数据库 2023年6月15日
    065
  • 500 ZuulException: Forwarding error

    com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.ne…

    数据库 2023年6月16日
    077
  • MySQL数据库性能优化

    前言 由于一些企业需要在本地部署系统(使用企业服务器部署系统,数据库也部署在同一台服务器上),本地部署的系统的服务器往往无法到达我们的云部署服务器,速度性能更差。尤其是在查询统计报…

    数据库 2023年5月24日
    087
  • 类的加载流程

    概述 什么是类加载呢? 我们知道一个Class文件编译完成之后是存在于磁盘的一个普通文件,如果想要执行,必然需要将 Class&#x6587;&#x4EF6;加载到…

    数据库 2023年6月11日
    067
  • MySQL高可用架构-MMM、MHA、MGR、PXC、分库分表(补总结)

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    数据库 2023年5月24日
    087
  • LeetCode 13. 罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如,罗马数字2写做II,…

    数据库 2023年6月11日
    078
  • 分布式事务解决方案

    分布式事务解决方案 花开堪折直须折,莫待无花空折枝。 分布式事务是指事务的操作位于不同的节点上,需要保证事务的ACID特性。在分布式架构下,每个节点只知晓自身操作的成功与失败,无法…

    数据库 2023年6月14日
    078
  • 数据库的备份和恢复命令,使用视图,索引,事务

    备份库 直接在cmd窗口中直接输入,结束不需要输入; mysqldump -h端口号 -u用户名 -p密码 数据库名>备份地址 恢复库 在cmd窗口中进行 1、连接数据库 m…

    数据库 2023年6月16日
    0111
  • 异常详解

    🦔异常 发现错误的理想时机是在编译阶段,也就是在运行程序之前。然而编译期间并不能找到所有的错误,余下的问题必须在运行期间解决。这就需要错误源能够通过某种方式,把适当的信息传递给某个…

    数据库 2023年6月14日
    072
  • 数据科学手把手:碳中和下的二氧化碳排放分析 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 本文地址:https://www.showm…

    数据库 2023年6月14日
    098
  • MySQL 期末试题

    当时我们期末的其中一套卷子, 好像有两套但是我当时懒得弄第二套. 就认真把第一套整了XD 一 单项选择题1.当隔离级别设置为read committed时,可以避免 。(2分)丢失…

    数据库 2023年6月11日
    069
  • MySQL<=>是什么鬼

    类似于相等比较 =运算符 官网描述 NULL-safe equal. This operator performs an equality comparison like the …

    数据库 2023年6月9日
    092
  • MySQL事务

    事务用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功后提交,要么全部失败。进行一个事物操作时,也可以防止其它用户修改表的数据。 举个例子:转账这个操作…

    数据库 2023年6月16日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球