2011-02-03 14 views
10

के लिए दिया गया है:स्काला इटरेटर और

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

मैं चला सकते हैं:

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 

नहीं करना चाहिए मैं मानचित्र चलाने के बाद/एक और (गैर-खाली) इटरेटर [स्ट्रिंग] वापस प्राप्त करता हूं?

उत्तर

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 

iterators के बाद से स्टेटफुल और रीसेट करने योग्य नहीं हैं, एक बार आप इसे इस्तेमाल किया है, यह खाली है और फिर से उपयोग नहीं किया जा सकता।

इसके बजाय, आप दृश्यों का उपयोग कर सकते हैं:

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

आप सही हैं! उदाहरणों को चलाने से पहले मैंने इटरेटर का उपयोग किया होगा। धन्यवाद! :) – ssanj

3

Iterators देखें।

iterators पर foreach विधि और traversable संग्रह पर एक ही विधि बीच एक महत्वपूर्ण अंतर नहीं है: जब पुनरावर्तक के लिए कहा जाता है, foreach जब यह किया जाता है इसके अंत में इटरेटर छोड़ देंगे। इसलिए एक ही इटरेटर पर next को फिर से कॉल करना NoSuchElementException के साथ विफल हो जाएगा। इसके विपरीत, जब एक संग्रह पर पर कहा जाता है, foreach संग्रह अपरिवर्तित में तत्वों की संख्या छोड़ देता है (जब तक पारित कर समारोह तत्वों को हटा करने के लिए कहते हैं, लेकिन यह, हतोत्साहित किया जाता है, क्योंकि यह आश्चर्य की बात परिणामों को जन्म दे सकती)।

...

आप देख सकते हैं, it.map करने के लिए कॉल के बाद, it इटरेटर अपने अंत करने के लिए उन्नत किया गया है।