Kotlin中遍历列表时如何引用新转换后的前序值?
解决依赖前序转换值的列表生成问题
map函数没法满足你的需求,因为它是对每个元素独立处理的,没有办法访问正在构建的新列表中的前序元素——每次迭代都是孤立的,和之前的结果不关联。
针对你举的累加和场景,有两种简洁的Kotlin实现方式:
方式一:使用runningFold(推荐)
Kotlin 1.4及以上版本提供了runningFold函数,专门用于生成包含累积结果的序列,完美适配这种依赖前序值的场景:
val myList = listOf(1, 2, 3, 4, 5) val result = myList.runningFold(0) { acc, current -> acc + current }.drop(1) println(result) // 输出: [1, 3, 6, 10, 15]
runningFold的第一个参数是初始累加值,这里传0是因为第一个元素需要加0(没有前序值);- 闭包里的
acc代表之前的累积结果,每次计算acc + current得到当前元素的转换值; - 生成的初始序列是
[0, 1, 3, 6, 10, 15],用drop(1)去掉开头的初始值,就得到预期结果。
方式二:使用fold手动构建列表
如果需要更灵活的自定义逻辑(比如非累加的复杂转换),可以用fold配合可变列表实现:
val myList = listOf(1, 2, 3, 4, 5) val result = myList.fold(mutableListOf<Int>()) { accumulatedList, current -> // 取已转换列表的最后一个值,没有的话用0 val previousValue = accumulatedList.lastOrNull() ?: 0 val currentTransformed = current + previousValue accumulatedList.add(currentTransformed) accumulatedList } println(result) // 输出: [1, 3, 6, 10, 15]
这里用可变列表作为累加器,每次计算完当前转换值后添加到列表中,最终返回整个列表。
内容的提问来源于stack exchange,提问作者paul go
相关产品推荐
相关产品推荐

