【发布时间】:2015-08-24 14:52:58
【问题描述】:
我从远程 API 中提取了一些数据,为此我使用了 Future 风格的接口。数据结构为链表。下面显示了一个相关的示例数据容器。
case class Data(information: Int) {
def hasNext: Boolean = ??? // Implemented
def next: Future[Data] = ??? // Implemented
}
现在我有兴趣向数据类添加一些功能,例如map、foreach、reduce 等。为此,我想实现某种形式的IterableLike,使其继承这些方法。
下面给出的是 Data 可以扩展的特征,以便它获取此属性。
trait AsyncIterable[+T]
extends IterableLike[Future[T], AsyncIterable[T]]
{
def hasNext : Boolean
def next : Future[T]
// How to implement?
override def iterator: Iterator[Future[T]] = ???
override protected[this] def newBuilder: mutable.Builder[Future[T], AsyncIterable[T]] = ???
override def seq: TraversableOnce[Future[T]] = ???
}
它应该是一个非阻塞实现,当它被执行时,它开始从远程数据源请求下一个数据。 然后可以做一些很酷的事情,例如
case class Data(information: Int) extends AsyncIterable[Data]
val data = Data(1) // And more, of course
// Asynchronously print all the information.
data.foreach(data => println(data.information))
界面不同也是可以接受的。但是结果应该以某种方式表示对集合的异步迭代。最好采用开发人员熟悉的方式,因为它将成为(开源)库的一部分。
【问题讨论】:
-
你真的要坚持
Iterator界面吗?您可以考虑使用(或实现)类似于Rx Observable 的东西。实际上 async Observable 是 dual 来同步 Iterable。 -
是的,这很好,它不必是这个特定的接口。唯一的要求是集合上的接口是异步的。然而,它不是一个自己产生信息的数据源,它不应该在没有订阅者请求的情况下开始产生事件。
-
你可能想看看 scalaz。您也许可以使用
ListT[Future, Data]做一些事情 -
看看推特的
Spool,基本上是Stream的异步版本。 -
@TravisBrown 我已经能够在 Spool 上实现一些看起来不错的东西,但是 Spool 中使用的 Futures 属于 Twitter 类型(即
com.twitter.util.Future),它与 Scala Futures 不能很好地结合。我已经采用了 stackoverflow.com/questions/30317473/… 发布的隐式转换,但是有没有计划将其更改为 scala 期货?
标签: scala future scala-collections