2010-09-02 47 views
1

为什么我会为以下代码获取OutOfMemoryError?流中的奇怪OutOfMemoryError

Stream.from(1).filter(N =>(1至20).forall(X => N%X == 0))。头

+1

项目欧拉问题5,呃? – 2010-09-02 15:47:16

+0

是的。 ////////// – user7854212 2010-09-02 15:55:28

回答

6

流具有在JVM上有一些限制。你在这里看到的问题是,你用Stream.from(1)创建的Stream被放在堆栈上,因此JVM拒绝垃圾回收。您传递给filter调用的谓词使流成长为232792560元素。

如果使用Iterator可以解决此限制:

Iterator.from(1).filter(n => (1 to 20).forall(x => n % x == 0)).next 
+1

耻辱你放弃答案! – 2010-09-02 15:47:40

+0

答案在很多地方都可以找到,Randall。 – user7854212 2010-09-02 15:56:09

+0

谢谢莫里茨。/ – user7854212 2010-09-02 15:57:10

3

流懒洋洋地评估,但他们存储他们的评价的结果。因此,除非您想多次遍历它们,否则应该使用Iterator

+0

非常丰富。感谢雷克斯! – user7854212 2010-09-02 16:11:06