的一个明显缺点是,它们会导致整个数组在内存中构造。当输入到推导式的本身是个小数组时它的开销是微不足道的—但是,当输入数组很大或者创建一个新的昂贵(或者是无限的)数组生成器时就可能出现问题。
生成器允许对序列延迟计算(lazy computation),在需要时按需计算元素。生成器表达式在句法上几乎和数组推导式相同—它用圆括号来代替方括号(而且用 for...in 代替 for each...in)—但是它创建一个生成器而不是数组,这样就可以延迟计算。你可以把它想象成创建生成器的简短语法。
假设我们有一个迭代器 it 来迭代一个巨大的整数序列。我们需要创建一个新的迭代器来迭代偶数。一个数组推导式将会在内存中创建整个包含所有偶数的数组:
复制代码 代码如下:
var doubles = [i * 2 for (i in it)];
而生成器表达式将会创建一个新的迭代器,并且在需要的时候按需来计算偶数值:
复制代码 代码如下:
var it2 = (i * 2 for (i in it));
print(it2.next()); //it 里面的第一个偶数
print(it2.next()); //it 里面的第二个偶数
当一个生成器被用做函数的参数,圆括号被用做函数调用,意味着最外层的圆括号可以被省略:
复制代码 代码如下:
var result = doSomething(i * 2 for (i in it));
End.
您可能感兴趣的文章: