2011-02-03 17 views
10

için Verilen:Scala Map ile Yineleyici ve

val list = List("one","two","three")  
val it = list.toIterator 

Ben çalıştırabilirsiniz:

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

Ben yineleyici aynı çalıştırırsanız alıyorum:

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

değil Olmalı Harita/çalıştırdıktan sonra başka bir (boş olmayan) yineleyici [String] geri alıyorum?

cevap

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 

Belki yineleyicinizi kullandınız? Yineleyicilerin yana

scala> res26.foreach{println} 
_one 
_two 
_three 

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

bunu kullanılan bir kere, bu boş ve tekrar kullanılamaz, sıfırlanabilir durum bilgisi ve değillerdir.

Bunun yerine, görünümleri kullanabilirsiniz:

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

Haklısınız! Örnekleri kullanmadan önce Iteratörü kullanmalıydım. Teşekkürler! :) – ssanj

3

Iterators bakınız.

Yineleyicilerin üzerinde foreach yöntemi ve çaprazlanabiliyorsa koleksiyonları aynı yöntemle arasında önemli bir fark vardır: bir yineleyici için çağrıldığında zaman yapılır, foreach onun sonunda yineleyici bırakacaktır. Aynı yineleyici üzerinde tekrar next numaralı çağrı, NoSuchElementException ile başarısız olur. Buna karşılık, bir koleksiyonda çağrıldığında, foreach, koleksiyondaki değişmeyen öğelerin sayısını değiştirmez (aktarılan işlev öğeleri kaldırmaya eklenmedikçe, ancak bu önerilmez, çünkü şaşırtıcı sonuçlar doğurabilir). Gördüğünüz gibi

...

, it.map çağrısının, it yineleyici sonuna kadar ilerlemiştir.