`Stream.take` 的奇怪行为
Strange behaviour of `Stream.take`
我正在尝试scala.Stream
的一些方法,并定义了这样一个方法:
def my(n: Int) = {
scala.Stream.from(1).flatMap { i =>
println("### " + i)
scala.Stream.from(i).takeWhile(_ < 10).map(j => (i, j))
}.take(n).filter(x => x._1 < 3 && x._2 < 5).toList
}
如果我给 n
号码 45
:
println(my(45))
终止速度非常快,并打印:
### 1
### 2
### 3
### 4
### 5
### 6
### 7
### 8
### 9
List((1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4))
但是如果n
是46
,它永远不会结束:
### 1
### 2
### 3
### 4
### 5
### 6
...
### 245684
### 245685
### 245686
### 245687
### 245688
### 245689
### 245690
### 245691
...
为什么这么奇怪?
PS: 我的scala版本是2.11.7
平面图结果中的第 45 个条目是 (9,9)。这是最后一个可以从 i < 10 的数字生成的元组。所以要生成第 46 个元组,代码接下来会尝试 i = 10,但是 Stream.from(i).takeWhile(_ < 10)
returns 没有有效的元组,因此代码移动立即到 i = 11,依此类推,给出您看到的打印行,但从不为流生成新元素...
我正在尝试scala.Stream
的一些方法,并定义了这样一个方法:
def my(n: Int) = {
scala.Stream.from(1).flatMap { i =>
println("### " + i)
scala.Stream.from(i).takeWhile(_ < 10).map(j => (i, j))
}.take(n).filter(x => x._1 < 3 && x._2 < 5).toList
}
如果我给 n
号码 45
:
println(my(45))
终止速度非常快,并打印:
### 1
### 2
### 3
### 4
### 5
### 6
### 7
### 8
### 9
List((1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4))
但是如果n
是46
,它永远不会结束:
### 1
### 2
### 3
### 4
### 5
### 6
...
### 245684
### 245685
### 245686
### 245687
### 245688
### 245689
### 245690
### 245691
...
为什么这么奇怪?
PS: 我的scala版本是2.11.7
平面图结果中的第 45 个条目是 (9,9)。这是最后一个可以从 i < 10 的数字生成的元组。所以要生成第 46 个元组,代码接下来会尝试 i = 10,但是 Stream.from(i).takeWhile(_ < 10)
returns 没有有效的元组,因此代码移动立即到 i = 11,依此类推,给出您看到的打印行,但从不为流生成新元素...