数组 – 为什么以及何时在Swift中使用lazy与Array?
[1,2,3,-1,-2].filter({ $0 > 0 }).count // => 3 [1,-2].lazy.filter({ $0 > 0 }).count // => 3 将延迟添加到第二个语句的优点是什么?根据我的理解,当使用lazy变量时,内存在使用时被初始化为该变量.在这种情况下它是如何有意义的? 试着更详细地了解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 }
使用懒惰: 在这种情况下,reduce是要求项目计数,过滤器将一直工作,直到找到一个,然后reduce将要求另一个,过滤器将工作,直到找到另一个. [1,-2].lazy.filter({ print("filtered one"); return $0 > 0 }) .reduce(0) { (total,elem) -> Int in print("counted one"); return total + 1 }
什么时候使用懒惰: 选项 – 点击懒惰给出了这样的解释: 从讨论懒惰: 在链接操作时使用lazy属性: >防止中间操作分配存储 要么 我想补充一点: 因此,例如,如果您正在搜索第一个正Int,则您希望在过滤器之前使用延迟,因为搜索将在您找到一个时立即停止,并且它将保存过滤器不必过滤整个数组,它会节省必须为过滤后的数组分配空间. 对于第3点,假设您有一个程序使用该范围上的过滤器显示1 … 10_000_000范围内的素数.您宁愿在找到它们时显示素数,而不是在显示任何内容之前等待计算它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |