【发布时间】: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不会创建迭代器,它只是map和flatMap的语法糖。 -
现在我开始想,这根本不可能,因为我的“任意逻辑”应该以某种方式阻塞并等待我的迭代器上的
next()调用。可能我必须重新设计我的逻辑,以便逐个生成项目。