Scala流与过滤

Scala流与过滤,scala,stream,scala-collections,Scala,Stream,Scala Collections,我一直在学习在Scala中对某些场景使用STEAM而不是列表,这个看似经典的场景出现在许多文本中: 假设我们想找到第二个质数,范围在1到10000之间 如果我们执行以下操作:1到10000个过滤器(iPrime)(1) 然后我们被迫在区间内构建整个素数列表,然后从列表中获取第二个元素 然而,如果我们使用一个流并将尾部的计算延迟到我们需要的时候,那么我们只需要找到范围内的前两个素数,然后就可以停止搜索范围内的其余部分 我的问题是:Scala怎么知道我只是在寻找第二个素数?Scala为什么不从左到右

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

假设我们想找到第二个质数,范围在1到10000之间

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

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

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

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

我确信编译器以某种方式将表达式转换为用户只需要index=(1)处的元素,但我很好奇这实际上是如何在“幕后”发生的

谢谢

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

也就是说,索引调用不是数组中的查找,其中的值可能是,也可能不是。它实际上是从第一个元素到请求的元素为止丢弃所有元素,就像它在
列表中所做的那样,或者任何
线性化的

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


也就是说,索引调用不是数组中的查找,其中的值可能是,也可能不是。它实际上是在丢弃从第一个元素到请求的一个元素的所有元素,就像在
列表中所做的那样,或者任何
线性化的
中所做的那样。

ah,因此创建了两个流。一个有[s.head,?和一个有[s.drop(1.head,?]是。但列表也是如此,但在列表的情况下,问号不会出现,因此我们在列表的尾部节省了计算时间,因为列表将在实例化时计算,而流仅在调用时计算。请记住,
List(1,2,3)
实际上是
Cons(1,Cons(2,Cons(3,Nil))
,所以您已经创建了尽可能多的列表,只要列表中有最上面的元素。实际上,我最近的评论中有一个输入错误。我的意思是我们将计算保存在流的尾部,所以创建了两条流。一个有[s.head,?和一个有[s.drop(1.head,?]是。但列表也是如此,但在列表的情况下,问号不会出现,因此我们在列表的尾部节省了计算时间,因为列表将在实例化时计算,而流仅在调用时计算。请记住,
List(1,2,3)
实际上是
Cons(1,Cons(2,Cons(3,Nil))
,所以您已经创建了尽可能多的列表,只要列表中有最上面的元素。实际上,我最近的评论中有一个输入错误。我的意思是,我们在流的尾部保存计算