【问题标题】:Feeding values to Iterator "from inside"“从内部”向迭代器提供值
【发布时间】:2017-02-16 15:31:53
【问题描述】:

我想在 Scala 中做这样的事情。

def getFancyIterator: Iterator[Int] = {
  ... { /// Some arbitrary logic goes here: conditionals, loops, whatever
    ... { 
      ... {
        val x = ...
        // Then at some point I call this:
        feedNext(x)
      }
    }
  }
}

现在,从外部看,所有这些都应该像普通的迭代器,所以我可以这样做,例如:

getFancyIterator.foreach(println)

诀窍当然是,我不想在任何时间点将所有这些值存储在一个集合中。换句话说,我希望我的 getFancyIterator 函数“按需”“提供”迭代器的 next() 值。

我确信一定有一些(令人尴尬的)简单的方法可以做到这一点,但不知何故,我并没有想到..

更新: 本质上我想做yield x,但不仅仅是来自普通的for循环,而是来自一些任意的代码。

【问题讨论】:

  • 如果feedNext 返回Iterator[Int] 你应该没问题。它实际上返回了什么?
  • 不,整个函数 getFancyIterator 返回和迭代器。 feedNext 只是标记了我想将下一个值“提供”给结果迭代器的地方。
  • 感谢编辑,丹妮拉
  • Scala 中的 for-yield 不会创建迭代器,它只是 mapflatMap 的语法糖。
  • 现在我开始想,这根本不可能,因为我的“任意逻辑”应该以某种方式阻塞并等待我的迭代器上的next() 调用。可能我必须重新设计我的逻辑,以便逐个生成项目。

标签: scala iterator


【解决方案1】:

直接实现Iterator接口即可,使用next()返回你的feedNext(x)值:

def getFancyIterator: Iterator[Int] = new Iterator[Int] {
  def hasNext = true //or some other flag to determine when you are done.
  def next():Int = {
    //some fancy logic goes here to calculate x
    1
  }
}

【讨论】:

  • 是的,我终于求助于这样的事情。然而我最初的想法是倒着做——我的奇特逻辑生成 xs 并通过一些特殊的方法feedNext“馈送”它们。然后迭代器的外部用户将在需要时通过在迭代器上调用next() 来获取这些值。但是我没有成功实现这个想法。这可能可以通过一些异步参与者发送 xs 作为消息来完成,但这对我来说太复杂了。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2020-04-21
  • 2019-08-20
  • 2017-03-07
  • 1970-01-01
相关资源
最近更新 更多