想象一下
val myFlow: Flow[Element] = ... //some flow..
给定权重函数
val weightFunction: Element => Int
我想获得一个
val transformedFlow: Flow[List[Element]]
这样transformFlow的每个元素都是一个List [Element],这样该列表中元素的权重之和大于给定的常量。
我将如何实现这一目标?
答案 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
的返回类型,您甚至不需要执行zip
和scan
- 请参阅此处的可运行代码示例: https://gist.github.com/MartinHH/a05a87269b1697d5f57a1c77db269767