【问题标题】:Why does performing a map on an iterator not cause it to be modified?为什么在迭代器上执行映射不会导致它被修改?
【发布时间】:2015-03-20 06:07:31
【问题描述】:
> 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
猜你喜欢
  • 2018-05-28
  • 2012-08-09
  • 2020-04-29
  • 2013-08-26
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多