非空迭代器打印后变空

Raa*_*afi 1 iterator scala

在 Scala 中,我使用 getLines 读取了一个文件,该文件返回了一个非空的迭代器。然后我使用 for 循环打印了这些行。之后,当我再次尝试打印时,它说空迭代器。有人可以解释一下吗?

scala> c
res1: Iterator[String] = non-empty iterator

scala> println(c)
non-empty iterator

scala> for ( line <- c) println(line)

insert into songlist (id, artist, title, numone) values (1, 'ABBA', 'WATERLOO', 0);
insert into songlist (id, artist, title, numone) values (2, 'ABBA',.............

scala> var d = for ( line <- c) println(line)
d: Unit = ()
scala> c
res8: Iterator[String] = empty iterator
Run Code Online (Sandbox Code Playgroud)

pra*_*upd 5

这是非常预期的行为,Iterator因为随着您不断遍历Iterator状态变化。(因此Iterator是可变的)

scala> Iterator("order1", "order2", "order3")
res8: Iterator[String] = non-empty iterator

scala> res8.foreach(println)
order1
order2
order3

scala> res8
res10: Iterator[String] = empty iterator
Run Code Online (Sandbox Code Playgroud)

阅读迭代器文档

特别重要的是要注意,除非另有说明,否则永远不要在调用迭代器的方法后使用它。

如果要多次迭代,请转换为不可变的数据结构,如列表或序列。

例子,

scala> Iterator("order1", "order2", "order3", "order4")
res18: Iterator[String] = non-empty iterator

scala> res18.toList
res19: List[String] = List(order1, order2, order3, order4)

scala> res19.foreach(println)
order1
order2
order3
order4

scala> res19.foreach(println)
order1
order2
order3
order4
Run Code Online (Sandbox Code Playgroud)

toSeq,

scala> Iterator("order1", "order2", "order3", "order4")
res23: Iterator[String] = non-empty iterator

scala> res23.toSeq
res24: Seq[String] = Stream(order1, ?)

scala> res24.foreach(println)
order1
order2
order3
order4

scala> res24.foreach(println)
order1
order2
order3
order4
Run Code Online (Sandbox Code Playgroud)