You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过reduce直接获取字符串数组最短元素长度的Int值?是否应改用fold?

关于用reduce直接获取最短字符串长度(Int值)及reduce vs fold的选择

好问题!咱们来拆解你的疑问,一步步解决:

1. 能不能用reduce()直接返回Int值?

当然可以!你之前的reduce是对String元素操作,最后取length,其实只要先把字符串数组转换成长度的Int数组,再用reduce就能直接得到Int类型的最小长度了:

val strs = arrayOf("abc", "ab", "a")
val minLength = strs.map { it.length }.reduce { currentMin, nextLen ->
    if (currentMin < nextLen) currentMin else nextLen
}
// 或者更简洁地用Kotlin标准库的min函数:
val minLengthSimpler = strs.map { it.length }.reduce(::min)

这样就跳过了中间的String类型,直接得到Int结果,逻辑更直接。

2. 是否应该改用fold()替代reduce()?

这取决于你的数组是否可能为空:

  • 如果数组永远非空:reduce是没问题的,它会用数组第一个元素的值作为初始比较值,逻辑简洁。
  • 如果数组可能为空:reduce会抛出NoSuchElementException,这时候fold更安全——因为fold允许你指定一个初始值,比如用Int.MAX_VALUE作为初始的“最小长度”,遍历数组时不断更新最小值:
val minLengthSafe = strs.fold(Int.MAX_VALUE) { currentMin, str ->
    min(currentMin, str.length)
}
// 如果数组为空,这里会返回Int.MAX_VALUE,你也可以改成0或其他符合业务需求的默认值

另外,其实Kotlin标准库已经有更简洁的写法了,比如用minOf结合map:

val minLengthOneLine = strs.minOf { it.length }

这个方法内部已经处理了空数组的情况(会抛出NoSuchElementException),如果需要空安全的版本,可以用minOfOrNull:

val minLengthNullable = strs.minOfOrNull { it.length } // 空数组时返回null

总结一下:

  • 想直接用reduce得到Int:先转成长度数组再操作
  • 数组可能为空时,优先用fold或者标准库的minOfOrNull
  • 追求简洁的话,直接用minOf/minOfOrNull是最省心的选择

内容的提问来源于stack exchange,提问作者djm.im

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:55:08