我看到一个答案到了这个问题,它在它的第一个版本,也有类似的代码如下:
let numbers = Array(0 ..< 50)
let result = numbers.lazy
.filter {
// gets called 2-3x per element in the range (0...15)!
print("Calling filter for: \($0)")
return $0 % 3 == 0
}
.prefix(5)
print(Array(result)) // [0, 3, 6, 9, 12]
Run Code Online (Sandbox Code Playgroud)
通过使用惰性过滤器集合,它能够过滤numbers满足给定谓词的前5个元素(在这种情况下,可被3整除),而无需评估数组中的每个元素numbers.
然而,答案然后指出,filter(_:)每个元素可以多次调用谓词(范围1 ... 15中的元素为3次,结果为0时为2).
这种过滤器的惰性评估效率低下的原因是什么?有没有办法避免多次评估同一元素?
假设我有这段代码:
func work<S: Sequence>(sequence: S) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
我怎么能弄清楚有多少元素sequence?
我想要的明显版本是非常低效的:
var count = 0
for element in sequence {
count += 1
}
Run Code Online (Sandbox Code Playgroud)
必须有一个更好的方式,对吧?