2017-12-11 16 views
0

スカラでは、空ではないイテレータを返したgetLinesを使用してファイルを読み取りました。それから、私はforループを使って行を表示しました。その後、再度印刷しようとすると、空のIteratorと表示されます。誰か説明できますか?非空のイテレータが印刷後に空になった

あなたは Iterator状態変化を横断保つようので、非常に Iteratorの振る舞いを期待されている
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 

答えて

3

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 

Iterator docs

を読む(したがってIteratorが可変である)これは、特に断りのない限り、 は1がそれにメソッドを呼び出した後にイテレータを使用しないでください、それを注意することが特に重要です。

複数回反復したい場合は、リストやシーケンスのような不変のデータ構造に変換します。

例えば、

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 

又は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