kotlin之Reduce/ReduceRight/fold/foldRight

kotlin的高阶函数:Reduce()   ReduceRight()

val s = listOf<String>("1", "2", "3")
println(s.reduce { acc, s -> s + acc })
println(s.reduce { acc, s -> acc + s })
println(s.reduceRight { s, acc -> s + acc })
println(s.reduceRight { s, acc -> acc + s })

如上的输出你能准确说出吗? 

321
123
123
321

其中2和4是正确的使用姿势,虽然1和3是错误的姿势,但同样可以实现效果

下面看源码分析:

public inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S {
    //累计因子acc,值为第一个元素的值。累计时从第二个元素开始
    val iterator = this.iterator()
    if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.")
    var accumulator: S = iterator.next()
    while (iterator.hasNext()) {
        //这里是重点,按照传入的operation的进行操作,函数作为参数传入
        accumulator = operation(accumulator, iterator.next())
    }
    return accumulator
}

这里最重要的就是operation对应的就是acc + s -> s + acc,也就是s和acc顺序写反导致结果相反的原因

比如[1, 2, 3]:

第一轮:acc = 1  s = 2 -> acc = 21  s = 2

第二轮:acc = 21  s = 3 -> acc = 321 s = 3

最终得到了321

同样的reduceRight也是一样的,reduceRight是累计因子取最后一个值,往前遍历

listIterator(size) 

原理就是这样,如果还感觉绕,可以把源码粘出来,直接自行断点/log调试,一目了然

fold() foldRight()原理一样,只是多了一个初始值,再累计

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值