簡體   English   中英

Scala迭代器與地圖和為

[英]Scala Iterator with Map and For

鑒於:

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

在我運行map / for之后,我不應該再找回另一個(非空的)Iterator [String]嗎?

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

迭代器

迭代器上的foreach方法和遍歷集合上的相同方法之間存在重要區別:當調用迭代器時, foreach將在完成時將迭代器留在其末尾。 因此,在同一個迭代器上再次調用next會因NoSuchElementException而失敗。 相比之下,當在集合上調用時, foreach會保持集合中元素的數量不變(除非傳遞的函數添加以刪除元素,但這是不鼓勵的,因為它可能會導致令人驚訝的結果)。

...

正如您所看到的,在調用it.mapit迭代器已經提前到了它的末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM