如何通过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
相关产品推荐
相关产品推荐

