[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 }
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
什么时候使用懒惰:
选项 – 点击懒惰给出了这样的解释:
从讨论懒惰:
>防止中间操作分配存储
要么
>当您只需要最终集合的一部分时,以避免不必要的计算
我想补充一点:
>当您希望下游流程更快地启动时,不必等待上游流程首先完成所有工作
因此,例如,如果您正在搜索第一个正Int,则您希望在过滤器之前使用延迟,因为搜索将在您找到一个时立即停止,并且它将保存过滤器不必过滤整个数组,它会节省必须为过滤后的数组分配空间.
对于第3点,假设您有一个程序使用该范围上的过滤器显示1 … 10_000_000范围内的素数.您宁愿在找到它们时显示素数,而不是在显示任何内容之前等待计算它们.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。