微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组 – 为什么以及何时在Swift中使用lazy与Array?

[1,2,3,-1,-2].filter({ $0 > 0 }).count // => 3

[1,-2].lazy.filter({ $0 > 0 }).count // => 3

将延迟添加到第二个语句的优点是什么?根据我的理解,当使用lazy变量时,内存在使用时被初始化为该变量.在这种情况下它是如何有意义的?

enter image description here

试着更详细地了解LazySequence的用法.我曾使用过映射,减少和过滤序列上的函数,但从不使用延迟序列.需要了解为何使用此功能

解决方法

延迟更改数组的处理方式.如果不使用惰性,则filter会处理整个数组并将结果存储到新数组中.使用延迟时,序列或集合中的值是根据下游函数的要求生成的.值不存储在数组中;它们只是在需要时生产.

考虑这个修改过的例子,其中我使用了reduce而不是count,以便我们可以打印出正在发生的事情:

不使用懒惰:

在这种情况下,在计算任何项目之前,将首先过滤所有项目.

[1,-2].filter({ print("filtered one"); return $0 > 0 })
    .reduce(0) { (total,elem) -> Int in print("counted one"); return total + 1 }

06001

使用懒惰:

在这种情况下,reduce是要求项目计数,过滤器将一直工作,直到找到一个,然后reduce将要求另一个,过滤器将工作,直到找到另一个.

[1,-2].lazy.filter({ print("filtered one"); return $0 > 0 })
    .reduce(0) { (total,elem) -> Int in print("counted one"); return total + 1 }

06003

什么时候使用懒惰:

选项 – 点击懒惰给出了这样的解释:

pop-up for lazy in Xcode

从讨论懒惰:

链接操作时使用lazy属性

>防止中间操作分配存储

要么
>当您只需要最终集合的一部分时,以避免不必要的计算

我想补充一点:
>当您希望下游流程更快地启动时,不必等待上游流程首先完成所有工作

因此,例如,如果您正在搜索一个正Int,则您希望在过滤器之前使用延迟,因为搜索将在您找到一个时立即停止,并且它将保存过滤器不必过滤整个数组,它会节省必须为过滤后的数组分配空间.

对于第3点,假设您有一个程序使用该范围上的过滤器显示1 … 10_000_000范围内的素数.您宁愿在找到它们时显示素数,而不是在显示任何内容之前等待计算它们.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐