2017-12-11 1 views
0

scala에서 비어 있지 않은 Iterator를 반환 한 getLines를 사용하여 파일을 읽었습니다. 그런 다음 for 루프를 사용하여 줄을 인쇄했습니다. 그 후 다시 인쇄를 시도하면 빈 Iterator가 표시됩니다. 누군가 설명 할 수 있습니까?비어 있지 않은 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는 변경할 수있다).

여러 번 반복하려는 경우 목록이나 시퀀스와 같은 변경 불가능한 데이터 구조로 변환하십시오.

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