为什么我会为以下代码获取OutOfMemoryError?
Stream.from(1).filter(n =>(1到20).forall(x =&n; n%x == 0))。head
答案 0 :(得分:6)
Streams对JVM有一些限制。你在这里看到的问题是你用Stream.from(1)
创建的Stream被放在堆栈上,因此JVM拒绝垃圾收集它。您传递给filter
调用的谓词可让Stream增长到232792560
元素。
如果您使用Iterator
,则可以解决此限制:
Iterator.from(1).filter(n => (1 to 20).forall(x => n % x == 0)).next
答案 1 :(得分:3)
对Streams进行了延迟评估,但他们存储了评估结果。因此,除非您想多次遍历它们,否则应使用Iterator
代替。