假设我有以下案例类:
case class Record(a: String, b: String)
case class Result(c: Int, d: Int)
还有一个函数,它做了很多事情,然后返回一个IO[Result]
def processRecord[record: Record]: IO[Result] = {
...
// Returns an IO[Result]
}
我需要一个名为save
的函数,它接收Records
的列表,然后需要将所有结果合并合并为一个结果
def combineStorageResults(result1: Result, result2: Result) = {
Result(result1.c + result2.c, result1.d/2 + result2.d/2)
}
我已经创建了以下代码,通过使用foldLeft
函数来实现这一点。然而,正如你所看到的,我需要在过程中间调用unsafeRunSync
,只是为了在最后将结果打包到IO
中。我想知道是否有任何方法可以做到这一点,但不必在函数中间调用unsafeRunSync
:
def save(records: Seq[Record]): Future[Result] = {
IO(records.foldLeft(Result(0, 0))((previousResult, evt) => {
val processedResult = processRecord(evt).unsafeRunSync()
combineStorageResults(previousResult, processedResult)
}
)).unsafeToFuture()
}
任何帮助将不胜感激。
1条答案
按热度按时间hgb9j2n61#
您可以先对每条记录调用
processRecord
,然后将它们合并组合起来。还可以使用cats中的traverse
(适用于List,因此将Seq转换为List)