我一直在学习在某些场景中使用Steams而不是Scala中的列表,这种看似经典的场景出现在很多文本中:
假设我们想要找到1到10000
范围内的第二个素数如果我们执行以下操作:1到10000过滤器(isPrime)(1)
然后我们被迫在区间内构建整个素数列表,然后才从列表中获取第二个元素。
然而,如果我们使用流并延迟计算尾部直到我们需要它,那么我们只需要找到范围中的前两个素数,然后可以停止我们搜索范围的其余部分。
我的问题是:Scala如何知道我只是在寻找第二个素数?为什么Scala不会从左到右计算表达式,然后找到流的第二个元素?如果在流计算出足够的素数之前过早地应用索引调用,则似乎存在超出边界异常的可能性。
我确定编译器以某种方式翻译表达式以考虑用户只想要索引=(1)的元素,但我很好奇这是如何实际发生在“引擎盖下”。
谢谢!
答案 0 :(得分:2)
实际上,stream(1)
相当于stream.drop(1).head
。
也就是说,索引调用不是数组中的查找,其中值可能是也可能不存在。它实际上是丢弃了第一个元素直到所请求的元素,就像在List
或LinearSeqOptimized
中完成的那样。