【问题标题】:Scala how to call a future function on hashmap itemsScala如何在hashmap项上调用future函数
【发布时间】:2020-07-16 15:56:25
【问题描述】:

我有一个哈希图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]]]

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

【问题讨论】:

    标签: scala scala-collections scala-cats


    【解决方案1】:

    我们可以像List这样的任何其他集合一样映射HashMap

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

    m: Map[A, Seq[B]]f: (B, A) =&gt; Future[Unit]。这将返回Iterable[Future[Unit]],因此我们可以使用Future.sequence 反转为Future[Iterable[Unit]]

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

    Futures 在内部使用 Try 代表成功/失败,我们可以使用 convertEither 使用 transformtoEither 像这样

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-11-23
      • 2013-04-07
      相关资源
      最近更新 更多