【问题标题】:Why does performing a map on an iterator not cause it to be modified?为什么在迭代器上执行映射不会导致它被修改?
【发布时间】:2026-02-05 06:15:01
【问题描述】:
> val textIt = text.split("\\s").iterator
> val upperIt = textIt.map(_.toUpperCase)
> textIt
res14: Iterator[String] = non-empty iterator

为什么textIt 不为空?由于map 对它们进行迭代,我希望它成为一个空迭代器。幕后究竟发生了什么?

【问题讨论】:

  • 什么是it?不应该改为:val upperIt = textIt.map(_.toUpperCase)
  • 我认为这是一个打字错误。假设它是textIt
  • 这个关于可变数据结构推理的麻烦是非常有道理的,你应该避免它们。

标签: scala functional-programming iterator


【解决方案1】:

方法Iterator.map返回新的Iterator对象而不遍历它:

def map[B](f: A => B): Iterator[B] = new AbstractIterator[B] {
  def hasNext = self.hasNext
  def next() = f(self.next())
}

当您迭代 upperIt 时,会执行对 textIt 的迭代。

【讨论】:

  • 你是说在这种情况下地图遍历textIt 的副本而不是真正的textIt