【问题标题】:Scala Iterator with Map and For带有 Map 和 For 的 Scala 迭代器
【发布时间】:2011-06-20 10:51:15
【问题描述】:

给定:

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 map iterator for-loop scala-collections


    【解决方案1】:
    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
    

    【讨论】:

    • 你是对的!在运行示例之前,我一定使用过迭代器。谢谢! :)
    【解决方案2】:

    Iterators

    迭代器上的foreach 方法与可遍历集合上的相同方法之间有一个重要区别:当调用迭代器时,foreach 将在迭代器完成后将其留在其末尾。所以在同一个迭代器上再次调用next 将失败并返回NoSuchElementException。相比之下,当在集合上调用时,foreach 保持集合中元素的数量不变(除非传递的函数添加到删除元素,但不鼓励这样做,因为它可能会导致令人惊讶的结果)。

    ...

    如您所见,在调用it.map 之后,it 迭代器已经前进到了终点。

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 2011-09-15
      • 2018-09-13
      • 2019-10-31
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      相关资源
      最近更新 更多