我有一个代码(sentences
在这里iterator
(:
def count() = {
var count = 0
for(sentence <- sentences.toStream) count += sentence.words.size
count
}
并测试:
// first
val wordCount1 = wordCounter.count()
wordCount1 must_== 10
// second time - should be same result
val wordCount2 = wordCounter.count()
wordCount2 must_== 10 // fails: result is 0
上次测试失败:
'0' is not equal to '10'
Expected :10
Actual :0
但是由于我在上面的代码中使用了sentences.toStream
,我想stream
它(理论上我可以重用它(。
问:为什么会失败?
编辑:我希望toStream
能有所帮助。就像这里描述的那样:(..."您可以多次遍历相同的Stream
"...(。就像我从不碰迭代器一样,我处理过流。
但我得到了.. sentences.toStream
用完了UP sentence-iterator
所以我不能再使用它了。我只是期望在iterator
上做toStream
时做一个逻辑,比如在不接触迭代器本身的情况下将流"链接"到迭代器。还行。。
它失败,因为sentences
Iterator
已用完。除了 next
和 hasNext
方法之外,在调用Iterator
的方法后,不应调用该。
一个简单的例子表明了这一点:
scala> val it = Iterator(1,2,3)
it: Iterator[Int] = non-empty iterator
scala> it.foreach(println(_))
1
2
3
scala> it.foreach(println(_))
scala>
在您的情况下,sentences
在第一次调用时已消耗,在第二次调用时为空,大小为 0。
调用toStream
不会改变这一点。你得到一个空的Stream
.如果要重用sentences
请在调用计数之前将其分配给具有val l = sentences.toList
的列表。
实际上toStream
有帮助。我只是将代码更改为期望stream
而不是iterator
,以便不尝试从 second+ 遍历上的"死"迭代器创建流。
那么我的解决方案是:
val stream = new SentenceFileReader("two_lines_file.txt").toStream
val wordCounter = new WordCounter(stream) // now it accepts stream but not iterator
// first
val wordCount1 = wordCounter.count()
wordCount1 must_== 10
// second time - same result
val wordCount2 = wordCounter.count()
wordCount2 must_== 10