【问题标题】:Play Framework Enumerator : How can you zip enumerator with Index播放框架枚举器:如何使用索引压缩枚举器
【发布时间】:2015-07-30 19:22:27
【问题描述】:

假设我有一个枚举器

val e: Enumerator[String] = Enumerator("a","b","c")

和另一个自然数的枚举数

val count = Enumerator.enumerate(Iterator.from(1))

我如何生成一个同时压缩它们的 Enumerator。或者用索引压缩 e。 所以在这种情况下输出是: val zipped: Enumerator[(String,Int)] = Enumerator(("a",1),("b",2),("c",3))

【问题讨论】:

    标签: scala playframework enumerator


    【解决方案1】:

    我对 Iteratees 有点陌生,但由于还没有回复,我将分享我的专业知识。

    似乎应该有一个 zip 运算符来执行您所描述的操作。最接近的是interleave,但根据我对其行为的理解,我认为它不适合您的用例。

    如果你只需要每个元素的索引,你可以使用这样的东西(我承认丑陋的可变状态)

    scala> import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.ExecutionContext.Implicits.global
    
    scala> import play.api.libs.iteratee._
    import play.api.libs.iteratee._
    
    scala> var counter = -1
    counter: Int = -1
    
    scala> Enumerator("a", "b", "c").map[(String, Int)]{ s => counter+=1; (s, counter) }
    res1: play.api.libs.iteratee.Enumerator[(String, Int)] = play.api.libs.iteratee.Enumerator$$anon$3@3c0c6967
    
    scala> res1 run Iteratee.foreach( println _ )
    (a,0)
    (b,1)
    res2: scala.concurrent.Future[Unit] = scala.concurrent.impl.Promise$DefaultPromise@7814bb7d
    (c,2)
    
    scala>
    

    如果您想要一些不会在 var 周围关闭的东西(您应该这样做!),您可以考虑在 iteratee 一侧实现此功能,并在 Step 进程中将计数器作为状态传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2022-11-22
      • 2023-04-04
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      相关资源
      最近更新 更多