【发布时间】:2014-12-25 21:14:38
【问题描述】:
当我使用列表时,它可以正常工作,但是当我创建无限流时
def foo = {
val s = Stream.from(1)
s.flatMap(x =>
s.flatMap(y =>
s.flatMap(z => f(x, y, z))))
}
我在调用时遇到 java.lang.OutOfMemoryError
foo.take(10)
关于 f
def f(x: Int, y: Int, z: Int) = {
if(Math.pow(x, 2) + Math.pow(y, 2) == Math.pow(z, 2) )
else None
}
最初,我认为只有当我为这 10 个元素调用它时才会评估它,但我知道我不确定。我遇到了与Iterator.from(1) 相同的问题
请提供任何帮助。提前谢谢!
【问题讨论】:
-
如何在流中的每个元素上进行平面映射。它的无限!您将耗尽内存。你到底想做什么?
-
你的代码对我有用。请发布您正在使用的确切代码,包括
f的定义。注意foo.take(10)返回一个 Stream,所以我们还需要知道你在用这个值做什么 -
我更新了我的问题。返回的流是我所期望的。谢谢保罗
-
@OK,所以失败了,而只返回 Some((x,y,z)) 的 f 没有。所以这是你对 x > y 的使用,它强制对 Stream 进行评估。
-
不评价怎么办?有什么方法可以在这里使用惰性吗?非常感谢保罗