是否可以在单个Enumerators
中创建多个Enumerator
?
我要找的是相当于返回List.partition
的{{1}},例如
(List[A], List[A])
理想情况下,我想在Enumerator上应用转换,允许我对数据进行分区,以便得到List().partition(_.age >= 18)
对。
使用Play的Iteratee API可以轻松实现吗?
我发现最接近的是(Enumerator[T], Enumerator[T])
方法,它允许对输入进行分组,但据我所知,如果我想要的只是2个分区(组),我将不得不使用整个{ {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
之类的东西。但不要这样做。