当前位置: 首页 > news >正文

Lists的分批次操作

Lists的分批次操作

1 方法解释

Lists.partition 方法,用于将一个列表分割成多个指定大小的子列表

Lists.partition(List list, int size) 方法接受两个参数:
list:要分割的原始列表。
size:每个子列表的大小。
该方法会将原始列表按照指定的大小分割成多个子列表,并返回一个包含这些子列表的新列表。
示例
假设我们有一个包含 10 个元素的列表,我们想将其分割成每个子列表包含 3 个元素

import com.google.common.collect.Lists;import java.util.List;public class PartitionExample {public static void main(String[] args) {// 创建一个包含 10 个元素的列表List<Integer> originalList = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 Lists.partition 方法将列表分割成每个子列表包含 3 个元素List<List<Integer>> partitions = Lists.partition(originalList, 3);// 遍历分割后的子列表for (List<Integer> partition : partitions) {System.out.println(partition);}}
}

输出结果:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]

2 实际业务场景

1 分批调用 CPI 系统的实现原理

借助Lists.partition方法把待处理的数据列表分割成多个规模较小的子列表,接着依次调用 CPI 系统处理这些子列表,最终汇总所有子列表的处理结果。

代码

import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;public class CPIService {// 模拟调用CPI系统的方法,每次最多处理3条数据public List<Result> callCPI(List<Request> batchRequests) {System.out.println("调用CPI系统,处理 " + batchRequests.size() + " 条数据");List<Result> results = new ArrayList<>();// 模拟处理每条数据for (Request request : batchRequests) {Result result = new Result();result.setRequestId(request.getId());result.setSuccess(true);results.add(result);}// 模拟网络延迟try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}return results;}// 分批调用CPI系统的方法public List<Result> batchCallCPI(List<Request> allRequests, int batchSize) {List<Result> allResults = new ArrayList<>();// 使用Lists.partition方法将大数据列表分割成多个小批次List<List<Request>> partitions = Lists.partition(allRequests, batchSize);// 依次处理每个批次for (List<Request> batch : partitions) {List<Result> batchResults = callCPI(batch);allResults.addAll(batchResults);}return allResults;}// 示例请求类static class Request {private String id;private String data;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getData() {return data;}public void setData(String data) {this.data = data;}}// 示例结果类static class Result {private String requestId;private boolean success;private String message;public String getRequestId() {return requestId;}public void setRequestId(String requestId) {this.requestId = requestId;}public boolean isSuccess() {return success;}public void setSuccess(boolean success) {this.success = success;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}}public static void main(String[] args) {CPIService service = new CPIService();// 创建包含10个请求的列表List<Request> allRequests = new ArrayList<>();for (int i = 1; i <= 10; i++) {Request request = new Request();request.setId("REQ-" + i);request.setData("数据" + i);allRequests.add(request);}// 分批调用CPI系统,每批处理3条数据List<Result> results = service.batchCallCPI(allRequests, 3);// 输出结果System.out.println("处理完成,共获得 " + results.size() + " 条结果");for (Result result : results) {System.out.println("请求ID: " + result.getRequestId() + ", 处理结果: " + (result.isSuccess() ? "成功" : "失败"));}}
}

2 代码解析

数据分割:
Lists.partition(allRequests, 3)把包含 10 个请求的列表分割成 4 个子列表,每个子列表分别包含 3、3、3、1 个请求。
分批处理:
借助循环依次处理各个子列表,每次处理 3 条数据。
callCPI方法模拟调用 CPI 系统,实际项目中这里会是真实的网络调用。
结果汇总:
把每个批次的处理结果添加到allResults列表中,最终得到完整的处理结果

3 实际使用优化

  • 批次大小设定:
    要依据 CPI 系统的性能和限制来确定合适的批次大小。
    可以通过配置参数或者动态计算来调整批次大小。
  • 错误处理:
    要添加重试机制,对网络异常等问题进行处理。
    可以采用熔断策略,防止系统崩溃。
  • 性能优化:
    可以使用多线程并发处理不同批次,提升处理速度。
    考虑添加异步处理和结果回调机制。
  • 日志监控:
    记录每个批次的处理情况,方便后续排查问题。
    对关键指标进行监控,如处理时间、成功率等。

通过这种分批调用的方式,能够有效避免因数据量过大导致的调用失败,同时还能提升系统的稳定性和处理效率。

http://www.dtcms.com/a/290700.html

相关文章:

  • 安卓第一个项目
  • 信息学奥赛一本通 1576:【例 2】选课 | 洛谷 P2014 [CTSC1997] 选课
  • Netty中CompositeByteBuf的使用
  • 位标志法处理多选字段在数据库中的存储方式 查询效率与扩展性之间的权衡
  • https正向代理 GoProxy
  • 苹果最新系统iOS 17的调试和适配方法 - Xcode 14.3.1 真机调试指南
  • How does Misinformation Affect Large Language ModelBehaviors and Preferences?
  • Spring Boot 集成 RabbitMQ:普通队列、延迟队列与死信队列全解析
  • iOS WebView 调试实战 页面跳转失效与历史记录错乱的排查路径
  • 物流链上的智慧觉醒:Deepoc具身智能如何重塑搬运机器人的“空间思维”
  • 达梦数据库JSON_TABLE使用说明
  • grpc: debug: GRPC_TRACE
  • ESP32开发——基于idf框架使用NVS操作存储设备读写
  • 家庭服务具身智能机器人体系架构
  • 一次 POI 版本升级踩坑记录
  • lesson20:Python函数的标注
  • docker nginx 部署前端踩坑记录
  • WinUI3开发_Frame用法
  • MYSQL:数据库约束
  • 【PTA数据结构 | C语言版】拓扑排序
  • 通信刚需小能手,devicenet转PROFINET网关兼容物流分拣自动化
  • 自动化计算机经过加固后有什么好处?
  • OpenAI API(2) OpenAI Responses API使用
  • 设备管理系统(MMS)如何在工厂MOM功能设计和系统落地
  • 深入解析 Linux 硬链接与软链接:原理、区别及应用场景
  • 龙虎榜——20250721
  • Linux中ELF区域与文件偏移量的关系
  • 【AI论文】EXAONE 4.0:融合非推理模式与推理模式的统一大语言模型
  • Neovim 安装与解压 tar.gz 文件
  • AXI接口学习