Scala如何在hashmap项上调用future函数



我有一个散列映射map: Map[A, Seq[B]],我想为映射中的每个B调用一个未来函数(返回Future[Either[Error, Unit]](。

例如,给定以下函数def fooFunc(hashMap: Map[A, Seq[B]]): Future[Either[Error, Unit]]

我试过类似的东西

def fooFunc(hashMap: Map[A, Seq[B]]): Future[Either[Error, Unit]] = {
val result = for {
_ <- hashMap.map(entry => 
entry._2.map( value => 
Future.sequence(futureFunc(value, entry._1)).liftF
)
)
} yield ()
result.value
}

给出编译错误Type mismatch, expected: NotInferedM[Future[NotInferedA]], actual: [Future[Either[Error, Unit]]]

这是我第一次处理期货和在hashmap上迭代,所以我很困惑如何准确地处理它和Iterable。任何提示都将不胜感激

我们可以像任何其他集合(如List(一样在HashMap上进行映射

m.flatMap({ case (key, values) => values.map(f(_, key)) })

其中CCD_ 8和CCD_。这返回Iterable[Future[Unit]],因此我们可以使用Future.sequence反转为Future[Iterable[Unit]]

m
.flatMap({ case (key, values) => values.map(f(_, key)) })
.pipe(Future.sequence(_))

期货内部使用Try表示成功/失败,我们可以像一样使用transformtoEither将其转换为Either

m                                                           // : Map[A, Seq[B]]
.flatMap({ case (key, values) => values.map(f(_, key)) }) // : Iterable[Future[Unit]]
.pipe(Future.sequence(_))                                 // : Future[Iterable[Unit]]
.map(_ => ())                                             // : Future[Unit]
.transform(tryResult => Success(tryResult.toEither))      // : Future[Either[Throwable, Unit]]

返回所需的CCD_ 17类型。pipe方法来自import util.chaining._

就我个人而言,从Map[A, Seq[B]]Future[Either[Error, Unit]]的转换感觉有点可疑

最新更新