Scala Streams并过滤

时间:2017-05-29 20:12:32

标签: scala stream scala-collections

我一直在学习在某些场景中使用Steams而不是Scala中的列表,这种看似经典的场景出现在很多文本中:

假设我们想要找到1到10000

范围内的第二个素数

如果我们执行以下操作:1到10000过滤器(isPrime)(1)

然后我们被迫在区间内构建整个素数列表,然后才从列表中获取第二个元素。

然而,如果我们使用流并延迟计算尾部直到我们需要它,那么我们只需要找到范围中的前两个素数,然后可以停止我们搜索范围的其余部分。

我的问题是:Scala如何知道我只是在寻找第二个素数?为什么Scala不会从左到右计算表达式,然后找到流的第二个元素?如果在流计算出足够的素数之前过早地应用索引调用,则似乎存在超出边界异常的可能性。

我确定编译器以某种方式翻译表达式以考虑用户只想要索引=(1)的元素,但我很好奇这是如何实际发生在“引擎盖下”。

谢谢!

1 个答案:

答案 0 :(得分:2)

实际上,stream(1)相当于stream.drop(1).head

也就是说,索引调用不是数组中的查找,其中值可能是也可能不存在。它实际上是丢弃了第一个元素直到所请求的元素,就像在ListLinearSeqOptimized中完成的那样。