Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据合并规则将两个枚举数合并到一个枚举数中_Java_Scala_Playframework 2.0_Enumerator_Iterate - Fatal编程技术网

Java 如何根据合并规则将两个枚举数合并到一个枚举数中

Java 如何根据合并规则将两个枚举数合并到一个枚举数中,java,scala,playframework-2.0,enumerator,iterate,Java,Scala,Playframework 2.0,Enumerator,Iterate,我们在Playframework上有一个小型Scala项目。我试着做每一件事都是被动的,但却遇到了一个问题 我有两个枚举器[A]实例,表示按日期排序的DB中的值。 我需要将它们作为单个枚举器返回[a]以保持日期顺序。我在枚举器[A]中没有找到任何解决方案,所以我在单个集合中累积A,然后对它们进行排序 case class A( created: Date, data: String ) val as: Enumerator[A] = findByAOrderedByCreated(

我们在Playframework上有一个小型Scala项目。我试着做每一件事都是被动的,但却遇到了一个问题

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

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

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

处理这个问题的反应式方法是什么?

这里有一个解决方案,它可以使用元素上的任何
排序来处理任意数量的
枚举数
值:

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
以应用于传入的每个
枚举器
,并创建一个
枚举器
以给出已排序的元素。
Iteratee
实例和
Enumerator
通过相互发送
Promise
实例进行通信(因此
Promise[Promise[IterateeReturn]]
等等)。

谢谢:)这意味着Play tech lead带来了很多麻烦。对不起,我花了一段时间才开始使用它。我们已经在生产中使用了上面的wingedsubmariner代码一段时间了,建议不要使用。它似乎包含内存泄漏,导致应用程序在与长枚举数一起使用时内存不足。因为我们团队中没有人能够理解它,所以我们也无法调试它。