2011-02-03 14 views
10

ために与えられScalaの地図とイテレータと

list map ("_" +) -> List(_one, _two, _three) 
for (i <- list) yield("_" + i) -> List(_one, _two, _three) 

私はイテレータで同じことを実行する場合、私は得る:

it map ("_" +) -> Iterator[java.lang.String] = empty iterator 
for (i <- it) yield("_" + i) -> Iterator[java.lang.String] = empty iterator 

べきではありませんmap/forを実行した後、別の(空ではない)Iterator [String]を返しますか?

答えて

15
scala> def ints(n: Int): Stream[Int] = n #:: ints(n + 1) 
ints: (n: Int)Stream[Int] 

scala> val list = List("one","two","three") 
list: List[java.lang.String] = List(one, two, three) 

scala> val it = list.toIterator 
it: Iterator[java.lang.String] = non-empty iterator 

scala> it map ("_" +) 
res24: Iterator[java.lang.String] = non-empty iterator 

scala> it map ("_" +) 
res25: Iterator[java.lang.String] = non-empty iterator 

scala> for (i <- it) yield("_" + i) 
res26: Iterator[java.lang.String] = non-empty iterator 

多分あなたのイテレータを使用しましたか?

scala> res26.foreach{println} 
_one 
_two 
_three 

scala> res26 
res28: Iterator[java.lang.String] = empty iterator 

イテレータはリセットステートフルではありませんので、あなたがそれを使用したら、それは空で、再度使用することはできません。

代わりに、ビューを使用することができます。

scala> val v = list.view 
v: java.lang.Object with scala.collection.SeqView[java.lang.String,List[java.lang.String]] = SeqView(one, two, three) 

scala> v map ("_" +) 
res29: scala.collection.SeqView[java.lang.String,Seq[_]] = SeqViewM(...) 

scala> for (i <- v) yield("_" + i) 
res30: scala.collection.SeqView[java.lang.String,Seq[_]] = SeqViewM(...) 

scala> res29.foreach{println} 
_one 
_two 
_three 

scala> res29 
res32: scala.collection.SeqView[java.lang.String,Seq[_]] = SeqViewM(...) 

scala> res29.foreach{println} 
_one 
_two 
_three 
+1

あなたは正しいです!私は例を実行する前にIteratorを使用しているに違いない。ありがとう! :) – ssanj

3

Iteratorsを参照してください。

イテレータと一筆コレクションに同じ方法でforeach法との重要な違いがあります:イテレータに呼ばれた場合、それが行われたときに、foreachは、その端部にイテレータを残します。したがって、同じイテレータでnextを再度呼び出すと、NoSuchElementExceptionで失敗します。対照的に、コレクションで呼び出された場合、foreachは、渡された関数が要素を削除するために追加されない限り、コレクション内の要素の数を変更しませんが、驚くべき結果につながる可能性があるため、これは推奨しません。

...

あなたが見ることができるように、it.mapを呼び出した後、itイテレータが最後まで進んでいます。