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

Scala how to call a future function on hashmap items

我有一个散列映射 map: Map[A, Seq[B]],我想为映射中的每个 B 调用一个未来函数(即 returns 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]]]

这是我第一次处理 futures 并迭代 hashmap,所以我很困惑如何准确地处理这个问题并处理 Iterable。任何提示将不胜感激

我们可以像 List

这样的任何其他集合一样映射 HashMap
m.flatMap({ case (key, values) => values.map(f(_, key)) })

其中 m: Map[A, Seq[B]]f: (B, A) => Future[Unit]。这 returns Iterable[Future[Unit]] 所以我们可以使用 Future.sequence 反转为 Future[Iterable[Unit]]

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

Futures 在内部使用 Try 表示 success/failure,我们可以使用 transformtoEither convertEither [=30] =]

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]]

其中 returns 所需的 Future[Either[Error, Unit]] 类型。 pipe 方法来自 import util.chaining._

个人感觉,从Map[A, Seq[B]]Future[Either[Error, Unit]]的转变,感觉有点可疑。