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/588234/

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

(0)

大家都在看

  • 离散化

    关于一个蒟蒻的成长历程 老师:”今天学习并查集……(略)” 老师:”好了讲完了,做几个题练练手吧。” &#8…

    数据结构和算法 2023年6月12日
    079
  • 爬虫历程

    第一章 &#x5173;&#x4E8E;&#x7F16;&#x7801;&#x95EE;&#x9898;&#xFF0C;&a…

    数据结构和算法 2023年6月12日
    071
  • CF1656H 题解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    0101
  • 再探快速排序 → 递进式演进,是否更容易理解?

    开心一刻 爷爷有退休金,奶奶没有 可奶奶很要强 为了不让爷爷看不起,她找了份环卫的工作 结果要早起,她起不来 现在爷爷每天要早起扫大街 前情回顾 关于快排,楼主之前写过两篇关于它的…

    数据结构和算法 2023年6月7日
    074
  • CF 795 div2

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    073
  • python+cv2实现自动gamma校正

    Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: Gamma变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像…

    数据结构和算法 2023年6月7日
    084
  • 大顶堆MaxHeap(原理与Java实现)

    1. 为什么要引入堆? 1.1 堆的应用场景 有时候我们面临一种实际应用场景需要根据任务的重要程度而划分优先级,对优先级高的任务提供优先服务。 优先级队列(Priority Que…

    数据结构和算法 2023年6月16日
    0121
  • 「题解」带分数

    (数学老师:你这是最简分数吗你!) 原题目链接:link 这道是深搜,平均用时 (3000\mathrm{ms});个人做法是暴力枚举,用时 (139\mathrm{ms})。但是…

    数据结构和算法 2023年6月8日
    085
  • Java序列化流的奇妙之旅

    Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流。 !!!好戏在后头!!! 1.IO流读写文件 先从一个普通文件读写字符串开始讲起。 例子:输出字符串到文件,再从文件…

    数据结构和算法 2023年6月16日
    092
  • 算法竞赛进阶指南 0x58 数据结构优化DP

    农民约翰正在指挥他的 N 头牛进行清理工作。他将一天划分为了 T 个班次(1∼ T)。 每头牛都只能在一天中的某一个时间段内进行不间断的工作。 你需要帮助约翰排列出一个合理的奶牛的…

    数据结构和算法 2023年6月12日
    078
  • 重载运算符

    struct node { int a,b; }; bool operator const node &x,const node &y) { return x.a&…

    数据结构和算法 2023年6月7日
    077
  • The Shared_ptr Class(memory header)

    1.A default initialized smart pointer holds a null pointer. shared_ptr<vector<string…

    数据结构和算法 2023年6月7日
    086
  • 深拷贝与浅拷贝

    1.浅拷贝 简单的赋值拷贝操作如果利用编译器提供的拷贝构造函数,会做浅拷贝操作浅拷贝带来的问题就是堆区的内存重复释放解决办法是深拷贝 // &#x6D45;&#x6…

    数据结构和算法 2023年6月7日
    074
  • 【题解】孤岛营救问题之拯救呆瓜大头兵 (普通bfs+状压)

    题目描述 (1944) 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图…

    数据结构和算法 2023年6月12日
    078
  • 学习笔记 网络流

    1.引入 想象这样一个场景:自来水厂和您家分别坐落在城市的两端。自来水厂可以以任意速率生产水,您家可以以任意速率接受水。您家和自来水厂之间有一些中转站和水管,水管有最大流速限制(即…

    数据结构和算法 2023年6月12日
    088
  • 蓝桥杯2022 括号序列树 第十三届蓝桥杯 决赛 C++ A组 J题

    有一棵二叉树,根结点上有一个空字符串,每个点的左儿子上的字符串为其父亲结点的字符串尾部额外加一个左括号,右儿子则是在尾部加一个右括号。树中的每个叶子结点上的字符串都分别和每个由 (…

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