gpt4 book ai didi

java - 如何根据合并规则将 2 个枚举器合并为一个

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:47 26 4
gpt4 key购买 nike

我们在 Playframework 上有一个小型 Scala 项目。我正在尝试做所有反应性的事情,但偶然发现了一个问题。

我有两个 Enumerator[A] 实例,表示按日期排序的数据库中的值。我需要将它们作为单个 Enumerator[A] 返回,以保持日期排序。我没有在 Enumerator[A] 中找到任何解决方案,所以我在单个集合中累积 A,然后对它们进行排序。

case class A(
created: Date,
data: String
)

val as: Enumerator[A] = findByAOrderedByCreated()
val bs: Enumerator[A] = findByBOrderedByCreated()

处理这个问题的 react 方式是什么?

最佳答案

这里有一个解决方案,它适用于在元素上使用任何 Ordering 的任意数量的 Enumerator 值:

import play.api.libs.iteratee._
import scala.concurrent._

object MergeEnums {
def apply[E: Ordering](enums: Enumerator[E]*)(implicit executor: ExecutionContext) = new Enumerator[E] {
def apply[A](iter: Iteratee[E, A]) = {
case class IterateeReturn(o: Option[(Promise[Promise[IterateeReturn]], E)])

val failP = Promise()
val failPF = failP.future
val initState = Future.traverse(enums) { enum =>
val p = Promise[IterateeReturn]()
enum.run(Iteratee.foldM(p) { (oldP: Promise[IterateeReturn], elem: E) =>
val p = Promise[Promise[IterateeReturn]]()
oldP success IterateeReturn(Some(p, elem))
p.future
} map { promise =>
promise success IterateeReturn(None)
}) onFailure { case t => failP failure t }
p.future
} map (_.map(_.o).flatten.toList)

Enumerator.unfoldM(initState) { fstate =>
Future.firstCompletedOf(Seq(fstate, failPF)) map { state =>
state.sortBy(_._2) match {
case Nil => None
case (oldP, elem) :: tail =>
val p = Promise[IterateeReturn]()
oldP success p
val newState = p.future.map(_.o.map(_ :: tail).getOrElse(tail))
Some(newState, elem)
}
}
} apply iter
}
}
}

它创建一个 Iteratee 以应用于传入的每个 Enumerator,以及一个 Enumerator 以提供已排序的元素。 Iteratee 实例和 Enumerator 通过向彼此发送 Promise 实例进行通信(因此 Promise[Promise[IterateeReturn]] 等等)。

关于java - 如何根据合并规则将 2 个枚举器合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23110082/

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