스칼라의 Iterator는 불변이 아닌 가변(mutable)이다. 마치 포인터처럼 내부 인덱스을 가지고 있기 때문에 잘 알아야 할 필요가 있다.
object Main extends App {
val list = List(1, 2, 3, 4, 5, 6)
val it = list.iterator
println(it.hasNext)
println(it.next)
println(it.next)
println(it.hasNext)
println(it.size)
println(it.hasNext)
println(it.size)
println(it.hasNext)
}
결과는 다음과 같다.
true
1
2
true
4
false
0
false
size를 호출한 이후, 완전히 이상해져버렸다.
코드로 설명해본다. ^은 리스트의 인덱스를 가르킨다.
size를 호출하면, 인덱스가 계산 후 끝으로 가버린다. 남은 크기를 리턴하지. 젙체 크기를 리턴하지 않는다.
val list = List(1, 2, 3, 4, 5, 6)
val it = list.iterator
println(it.hasNext) // ^ 1 2 3 4 5 6
println(it.next) // 1 ^ 2 3 4 5 6
println(it.next) // 1 2 ^ 3 4 5 6
println(it.hasNext)
println(it.size) // 1 2 3 4 5 6 ^
println(it.hasNext) // false
println(it.size) // 0
println(it.hasNext) // false
문서에 보면, next와 hasNext를 제외하고는 Iterator 내부의 값이 바뀔 수 있다고 한다.
http://www.scala-lang.org/api/current/index.html#scala.collection.Iterator
It is of particular importance to note that, unless stated otherwise, one should never use an iterator after calling a method on it. The two most important exceptions are also the sole abstract methods: next
and hasNext
.
'scala' 카테고리의 다른 글
List에 적용하는 for yield 예시 2 (0) | 2016.10.24 |
---|---|
[scala] 정수의 산술 연산시 IllegalFormatConversionException 발생 (0) | 2016.10.19 |
[scala] Stream.empty 패턴 매치 (0) | 2016.10.18 |
[scala] 튜플 리스트를 Map으로 변환하기 (0) | 2016.10.17 |
[scala] triple quotes - """ 예시 (0) | 2016.10.17 |