序列探究之延迟执行的奥秘

序列延迟执行

序列本质上也是集合,他是集合的封装,为集合提供了延迟执行的能力

对于集合来说内部迭代期会立即执行但我们可能并不是立即需要或者整个运行时都不会用到这个值,这个时候内部迭代器的运行就是不必要而且还可能是复杂(对于无线序列来说,可能需要运行很久但是我们并不是立马需要这个序列)的

因此序列出现了,在调用方式上和List是一样的内部迭代器方式,但是传入的Lambda并不会立即执行,而是在调用终端操作符的时候才会去进行计算Lambda

现在应该有些困惑了,比如怎么做到的延迟执行呢?调用终端操作符为什么可以进行执行?

先说一下延迟执行的含义就好理解了,更全面的说应该叫延迟执行函数

持有函数引用

1. 首先函数的延迟调用一定要持有函数的引用是吧?

函数的表现形式有哪些呢?直接声明函数,或者通过接口来声明函数。

2.如何持有函数?

上面说过直接声明的函数和通过接口来声明的函数。

第一种可以通过Kotlin提供的高阶函数特性直接传递函数引用即可;如果函数特别多呢?传递一大堆参数看起来就很不优雅,所以就是第二种的方式传递接口的引用

3.如何做到延迟?

这个词乍一听比较高大上,其实就是持有着函数的引用在合适的时机调用。

我们平常写的方法不也是只有调用的时候才会执行吗?一样的道理哈哈

知道了这个之后你就会发现序列的这个延迟执行是怎么实现的了,序列是集合的封装因此也要和集合一样实现迭代器

序列在使用内部迭代器的时候并不会像集合那样立即调用传入的Lambda函数,而是将其保存起来。多个内部迭代器就串起来了(也就是下一个迭代器包含上一个迭代器的引用,在迭代的时候会先调用上一个迭代器的迭代方法)。

那么什么时候执行呢?

终端操作符顾名思义就是到了终端该要取值了也就是该调用保存的函数引用了,比如获取就是终端操作符(first,foreach…)

调用终端操作符时会调用保存的上一个迭代器和内部迭代期特有的处理逻辑相结合来实现流式取值

PS:如果序列明之后就直接调用了终端操作符,那么和使用集合并无二异、

延迟执行的精髓就是在于在合适的地方调用函数
如果在不合适的地方或者并不需要延迟的地方调用也就违反了其设计宗旨

总结

看了上面这些如果你使用过或者看到过flow那么你一定也知道flow的实现方式了

Flow传递的处理逻辑Lambda比较简单需要传递的函数数量也比较少,因此Flow在处理时只保留了函数引用而不是像序列一样保留集合

PS:当然如果你自己扩展了Flow的函数,如果传递的函数参数过多,可以像序列一样传递集合而不是多个函数引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值