如何从单个枚举器中生成多个枚举器(partition,split,..)

时间:2013-12-03 23:00:53

标签: scala asynchronous playframework enumerator iterate

是否可以在单个Enumerators中创建多个Enumerator? 我要找的是相当于返回List.partition的{​​{1}},例如

(List[A], List[A])

理想情况下,我想在Enumerator上应用转换,允许我对数据进行分区,以便得到List().partition(_.age >= 18) 对。

使用Play的Iteratee API可以轻松实现吗?

我发现最接近的是(Enumerator[T], Enumerator[T])方法,它允许对输入进行分组,但据我所知,如果我想要的只是2个分区(组),我将不得不使用整个{ {1}}获得结果。但我希望生成的枚举器可以从输入异步馈送。

1 个答案:

答案 0 :(得分:3)

List不同,Enumerator不代表数据集合,而是Iteratee可以连接的数据源。当Iteratee消耗输入时,数据将流式传输到Iteratee。因此,没有明确定义此Enumerator返回的两个Enumerator.partition实例的行为方式。如果消耗第一个Iteratee的{​​{1}}已准备好接受更多输入,但第二个不是,那么会发生什么?第一个是否只需要等待?数据是否为第二个缓冲?如果两个Enumerator实例中的一个表示它不再需要输入,或者因错误而死亡,会发生什么?我们杀了另一个吗?我们是否让它继续下去,扔掉原本用于死亡Iteratee的数据?

因此,实际上不存在单一的规范Iteratee方法,就像partition一样。你当然可以编写一个符合你想要它的方式,但在实际操作中,让一个List进行所有处理可能更容易。如果您正在寻找Iteratee,因为您想要并行运行这两个流,您可能想要使用Akka。如果您只想拥有Iteratee API提供的流水线并行性,那么您可以使用partition来允许以后的Enumeratee[Whatever, Either[Whatever]]实例仅转换它们所需的流部分。

如果你愿意沉迷于monad变形金刚的黑魔法,那么我认为可能有办法使用Haskell的Enumeratee之类的东西。但不要这样做。