gpt4 book ai didi

Scala future 结合

转载 作者:行者123 更新时间:2023-12-02 08:27:42 29 4
gpt4 key购买 nike

想象一下 InputStream 的以下变体:

trait FutureInputStream {
//read bytes asynchronously. Empty array means EOF
def read(): Future[Array[Byte]]
}

问题是如何为这样的流编写 discardAll 函数?这是我的解决方案:

//function that discards all input and returns Future completed on EOF
def discardAll(is: FutureInputStream): Future[Unit] = {
val f = is.read()
f.flatMap {
case v if v.length == 0 =>
Future successful Unit
case _ =>
discardAll(is)
}
}

此代码的明显问题是不可优化的递归:它会很快耗尽堆栈。有没有更高效的解决方案?

最佳答案

您的解决方案没有任何问题。对 discardAll(is) 的调用是异步完成的。它不会发生在与上一次调用相同的堆栈帧中,因此不会发生堆栈溢出。

你可以看到一个简单的实现会发生什么:

trait FutureInputStream {
var count = 0
def read(): Future[Array[Byte]] = {
if(count < 100000) {
count += 1
Future(Array(1))
} else
Future(Array())
}
}

如果您将上面的实例提供给 discardAll,那就没问题了。

scala> val is = new FutureInputStream{}
is: FutureInputStream = $anon$1@255d542f

scala> discardAll(is).onComplete { println }
Success(())

关于Scala future 结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30551772/

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