gpt4 book ai didi

scala - 将返回 Option 的副作用函数转换为迭代器

转载 作者:行者123 更新时间:2023-12-02 07:37:26 26 4
gpt4 key购买 nike

假设我们有一个副作用“生产者”函数f: () => Option[T],当重复调用直到 future 某个点时,它会返回一个Some它将永远返回 None。 (例如,在 EOF 处生成 null 的封装 Java API 很可能具有这种行为)。

是否可以将此函数包装成 TraversableOnceIterator 之类的东西,并具有以下约束:

  • 首选标准 Scala 库构造
  • 序列可以任意长并包含所有值,例如不需要在 Stream
  • 同样,也不可能出现堆栈溢出
  • 可见的用户源代码不应使用var
  • 不需要线程安全

Iterator 对象上有一些有用的方法,但没有一个与我的用例完全匹配。欢迎任何想法!

最佳答案

这可以解决问题:

def wrap[T](f: () => Option[T]): Iterator[T] = {
Iterator.continually(f()).takeWhile(_.isDefined).flatten
}

REPL 测试:

scala> :paste
// Entering paste mode (ctrl-D to finish)
var i = 0
def sideEffectingFunc(): Option[Int] = {
i += 1
if (i < 10) Some(i)
else None
}
// Exiting paste mode, now interpreting.

i: Int = 0
sideEffectingFunc: ()Option[Int]

scala> val it = wrap(sideEffectingFunc)
it: Iterator[Int] = non-empty iterator

scala> it.toList
res1: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

关于scala - 将返回 Option 的副作用函数转换为迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35550739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com