在Akka Streams中按权重函数对流元素进行分组

时间:2016-04-05 03:40:58

标签: scala akka-stream

想象一下

val myFlow: Flow[Element] = ... //some flow..

给定权重函数

val weightFunction: Element => Int

我想获得一个

val transformedFlow: Flow[List[Element]]

这样transformFlow的每个元素都是一个List [Element],这样该列表中元素的权重之和大于给定的常量。

我将如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

如何使用scan创建累积权重流,然后使用原始元素流zip结果,然后使用splitAfter创建子流?我甚至没有尝试编译以下内容,但我希望你能得到这个想法:

val broadCast = builder.add(Broadcast[Element](2))
val zip = builder.add(Zip[Element, Boolean])

myFlow.shape.out ~> broadCast.in

broadCast.out(0) ~> zip.in0

broadCast.out(1).scan(0){ (totalWeight, elem) =>
  if(totalWeight > Limit) weightFunction(elem)
  else totalWeight + weightFunction(elem)
}.map(_ > Limit) ~> zip.in1

val resultFlow =
  zip.out.splitAfter(_._2)
    .fold(List.empty[Element]){ case (list, (elem, _)) => elem :: list }
    .concatSubstreams

(您可能需要考虑在resultFlow上执行map(_.reverse)。)

修改:如果更改broadcast的返回类型,您甚至不需要执行zipscan - 请参阅此处的可运行代码示例: https://gist.github.com/MartinHH/a05a87269b1697d5f57a1c77db269767