Scala 迭代器和流示例.流在重用时失败



我有一个代码(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已用完。除了 nexthasNext 方法之外,在调用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

相关内容

  • 没有找到相关文章

最新更新