我有一个Source[ByteString]
,需要按以下方式进行转换:
ByteString
元素都需要连接一个加密签名。理想情况下,期望的结果是通过签名链接在一起的Source
个数据块。整体功能签名为(Source[ByteString]) => Source[ByteString]
。几乎像map()
,但计算上将后来的元素绑定到它们的前辈。
我曾希望使用Source.fold()
来实现这一目标,但我无法找到合适的zero
,它会让我在每次迭代中都带有签名,但也会发出签名块就像流刚刚被映射过一样。
(具体而言,我正在尝试实施AWS S3算法来签署分块对象上传,如http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition所述。)
这是一个很好的方法吗?
答案 0 :(得分:2)
你几乎想到在这里使用fold
- 你需要scan
,它基本上是相同的,但保留了转换元素的流,并将结果传递给下一次迭代。
因此,如果你有方法def sign(prevElement: ByteString, thisElement: ByteString): ByteString
,你的流程可以描述如下:
Flow[String]
.scan(zeroSignature)(sign)
.drop(1)
scan
保留您可能不需要的零元素,因此需要drop(1)
才能丢弃它。