1. 引言

在实际开发中,经常需要将一个长字符串分割成若干个较小的块进行处理。例如在传输大数据量文本、日志处理或界面展示时,将字符串拆分成固定大小的块可以提升程序的可读性和处理效率。

在 Kotlin 中,有多种方式可以实现这一功能。本文将介绍几种常见的实现方法,并结合 JUnit 测试代码进行演示,帮助你选择最适合当前场景的方案。

2. 问题理解

我们希望实现的功能是:给定一个字符串和一个整数 n,将字符串按每 n 个字符为一组进行分割。如果字符串长度不是 n 的整数倍,则最后一组可以小于 n。

例如,将字符串 "HelloWorld" 按每组 3 个字符进行分割,结果应为:

["Hel", "loW", "orl", "d"]

3. 使用 chunked() 函数(推荐)

Kotlin 标准库提供了一个非常方便的函数 chunked(),可以直接用于字符串或列表的分块操作。

✅ 优点:

  • 代码简洁
  • 可读性高
  • Kotlin 原生支持

3.1. 基本用法

val input = "HelloWorld"
val chunkSize = 3
val chunks = input.chunked(chunkSize)
assertEquals(listOf("Hel", "loW", "orl", "d"), chunks)

chunked() 函数会返回一个 List<String>,其中每个元素是长度为 chunkSize 的字符串块,**最后一个块可能小于 chunkSize**。

3.2. 补齐最后一个块(可选)

如果你希望所有块的长度都一致,可以在调用 chunked() 之前使用 padEnd() 对字符串进行填充:

val input = "HelloWorld"
val chunkSize = 3
val paddedInput = input.padEnd(
    input.length + chunkSize - (input.length % chunkSize),
    ' '
)
val chunks = paddedInput.chunked(chunkSize)
assertEquals(listOf("Hel", "loW", "orl", "d  "), chunks)

⚠️ 注意:这种方式会添加空格字符,需根据业务判断是否接受。

4. 使用 windowed() 函数实现分块

虽然 windowed() 主要用于滑动窗口操作,但通过设置参数也可以实现类似分块效果。

✅ 优点:

  • 更灵活,适合需要滑动窗口逻辑的场景

示例代码:

val input = "HelloWorld"
val chunkSize = 3
val chunks = input.windowed(
    size = chunkSize,
    step = chunkSize,
    partialWindows = true
)
assertEquals(listOf("Hel", "loW", "orl", "d"), chunks)

关键参数说明:

  • size: 窗口大小(即每块长度)
  • step: 每次滑动的步长(设为 size 实现非重叠分块)
  • partialWindows: 是否包含长度不足的最后一个窗口

5. 手动实现分块逻辑

如果你需要对分块过程有更细粒度的控制,或者在 Kotlin 不支持 chunked() 的老版本中,可以手动实现逻辑。

✅ 优点:

  • 更灵活,适用于复杂场景
  • 易于调试和扩展

示例代码:

val input = "HelloWorld"
val chunkSize = 3
val chunks = mutableListOf<String>()

for (i in 0 until input.length step chunkSize) {
    val end = (i + chunkSize).coerceAtMost(input.length)
    chunks.add(input.substring(i, end))
}

assertEquals(listOf("Hel", "loW", "orl", "d"), chunks)
  • 使用 substring(i, end) 提取子串
  • coerceAtMost() 确保不会越界

6. 总结

在 Kotlin 中,将字符串按指定大小分块有以下几种方式:

方法 是否推荐 特点
chunked() ✅ 推荐 最简洁,推荐首选
windowed() ✅ 推荐 更灵活,适合滑动窗口
手动实现 ⚠️ 可选 适用于复杂控制或老版本

在大多数情况下,使用 chunked() 是最直接、最清晰的方式。只有在需要更复杂逻辑或兼容性考虑时,才建议手动实现。


完整示例代码已上传至 GitHub:Split String into Chunks 示例代码(模拟链接)


原始标题:Split a String Into Chunks of a Given Size in Kotlin