2

Enumerators是否可以从单个中创建多个Enumerator?我正在寻找的是相当于List.partition返回 a (List[A], List[A]),例如

List().partition(_.age >= 18) 

所以理想情况下,我想在 Enumerator 上应用一个转换,它允许我对数据进行分区,以便得到一(Enumerator[T], Enumerator[T])对。

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

我找到的最接近的Enumeratee.grouped方法是允许对输入进行分组的方法,但据我所知,如果我想要的只是 2 个分区(组),我将不得不消耗整个Enumerator来获得结果。但我希望生成的枚举器从输入异步馈送。

4

1 回答 1

3

与 不同ListEnumerator不代表数据的集合,而是Iteratee可以连接到的数据源。数据IterateeIteratee消耗输入时流式传输到 。因此,并没有很好地定义Enumeratorthis 返回的两个实例的Enumerator.partition行为方式。如果Iteratee消费第一个Enumerator准备好接受更多输入,但第二个没有,会发生什么?第一个只需要等待吗?数据是否会为第二个缓冲?如果两个Iteratee实例之一说它不再需要任何输入,或者因错误而死,会发生什么?我们杀了另一个?我们是否让它继续下去,丢弃原本为死者准备的数据Iteratee

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

如果您愿意沉迷于 monad 转换器的黑魔法,那么我认为可能有一种方法可以使用类似 Haskell 的东西EitherT。但不要那样做。

于 2013-12-04T04:19:19.833 回答