加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:49:49 所属栏目:百科 来源:网络整理
导读:[1,2,3,-1,-2].filter({ $0 0 }).count // = 3[1,-2].lazy.filter({ $0 0 }).count // = 3 将延迟添加到第二个语句的优点是什么?根据我的理解,当使用lazy变量时,内存在使用时被初始化为该变量.在这种情况下它是如何有意义的? 试着更详细地了解LazySequence
[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范围内的素数.您宁愿在找到它们时显示素数,而不是在显示任何内容之前等待计算它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读