最简单方法是在你的迭代器使用toStream
权:
scala> val f = List(1,2,3,4,5,6,7,8,9,10).toIterator.toStream
f: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> f take 5 foreach println
1
2
3
4
5
scala> f take 5 foreach println
1
2
3
4
5
在你的具体情况下,问题是,你对代替val
因为def
每numSeq
呼叫全新的流。你仍然需要def
递归定义,但不要忘了将它保存到val
使用前:错误的使用
scala> def numSeq: Stream[BigInt] = Stream.cons(BigInt(f.next()),numSeq)
numSeq: Stream[BigInt]
scala> val numSeq1 = numSeq
numSeq1: Stream[BigInt] = Stream(1, ?)
scala> numSeq1 take 5 foreach println
1
2
3
4
5
scala> numSeq1 take 5 foreach println
1
2
3
4
5
例子(注意numSeq
而不是numSeq1
):
scala> numSeq take 5 foreach println
6
7
8
9
10
scala> numSeq take 5 foreach println
java.util.NoSuchElementException: next on empty iterator
at scala.collection.Iterator$$anon$2.next(Iterator.scala:39)
at scala.collection.Iterator$$anon$2.next(Iterator.scala:37)
at scala.collection.LinearSeqLike$$anon$1.next(LinearSeqLike.scala:59)
at .numSeq(<console>:14)
... 33 elided
顺便说一句,还有更多可爱#::
语法cons
:
import Stream._
def numSeq: Stream[BigInt] = BigInt(f.next()) #:: numSeq
val numSeq1 = numSeq
最后,VERSI在更好的封装上:
val numSeq = {
def numSeq: Stream[BigInt] = BigInt(f.next()) #:: numSeq
numSeq
}
感谢您的解释! – Rnet 2015-04-05 17:09:20