如何在集合分块处理时传递并使用块编号?
Kotlin分块处理时生成带序号文件名的实现方案
完全不需要依赖时间段计数,利用Kotlin的chunked结合forEachIndexed就能直接获取每个分块的编号,在转换、存储环节直接复用该编号生成batch_01.xml这类文件名,逻辑简洁且可靠。
核心建议
- 直接绑定分块索引作为编号:
chunked返回分块后的列表,通过forEachIndexed遍历可直接拿到从0开始的索引,将其+1即可得到从1开始的批次号,无需额外计数逻辑。 - 统一编号格式:用
String.format("%02d", batchNumber)生成两位补零的序号,保证文件名格式统一(如batch_01.xml而非batch_1.xml)。 - 转换与存储共享编号:遍历分块时将编号传递给转换、存储函数,确保每个分块的处理链路使用同一编号,避免逻辑脱节。
完整示例代码
// 模拟你的业务数据模型 data class BusinessModel(val id: Long, val data: String) fun main() { // 模拟待处理的对象集合 val dataCollection = List(27) { BusinessModel(it.toLong(), "Sample Data $it") } // 按每10个对象分块(可根据内存占用调整大小) val dataChunks = dataCollection.chunked(10) // 遍历分块并处理,同时获取批次编号 dataChunks.forEachIndexed { chunkIndex, chunk -> val batchNumber = chunkIndex + 1 // 1. 将分块对象转换为XML(可传入批次编号用于XML内标识) val xmlContent = transformChunkToXml(chunk, batchNumber) // 2. 生成带编号的文件名 val fileName = String.format("batch_%02d.xml", batchNumber) // 3. 通过HTTP/FTP存储XML文件 persistXml(fileName, xmlContent) } } /** * 将分块对象转换为XML格式,可传入批次编号用于XML内部标记 */ fun transformChunkToXml(chunk: List<BusinessModel>, batchNumber: Int): String { val xmlBuilder = StringBuilder() xmlBuilder.append("""<batch batchNumber="$batchNumber">""") chunk.forEach { model -> xmlBuilder.append("""<item id="${model.id}">${model.data}</item>""") } xmlBuilder.append("</batch>") return xmlBuilder.toString() } /** * 模拟HTTP/FTP存储逻辑 */ fun persistXml(fileName: String, xmlContent: String) { // 这里替换为实际的HTTP上传或FTP存储代码 // 例如HTTP用OkHttp发送文件,FTP用Apache Commons Net实现上传 println("Successfully stored: $fileName") }
特殊场景补充
如果需要跨多次运行保持批次编号连续(如当日最后一批是05,次日从06开始),则需要将当前最大批次号持久化到文件或数据库中,每次启动时读取并递增。但如果只是单次分块处理的连续编号,上述示例的方案完全足够,无需引入额外复杂度。
内容的提问来源于stack exchange,提问作者jactor-rises
相关产品推荐
相关产品推荐

