加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何将地图[A,未来[B]]转换为未来[地图[A,B]]?

发布时间:2020-12-16 09:43:43 所属栏目:安全 来源:网络整理
导读:我一直在使用Scala Akka图书馆,遇到一些问题。如标题所示,我需要将Map [A??,Future [B]]转换为Future [Map [A??,B]]。我知道可以使用Future.sequence作为列表中的Iterables,但是在这种情况下不起作用。 我想知道:Scala有没有一个干净的方式进行这种转
我一直在使用Scala Akka图书馆,遇到一些问题。如标题所示,我需要将Map [A??,Future [B]]转换为Future [Map [A??,B]]。我知道可以使用Future.sequence作为列表中的Iterables,但是在这种情况下不起作用。

我想知道:Scala有没有一个干净的方式进行这种转换?

解决方法

看看这是否适合你:

val map = Map("a" -> future{1},"b" -> future{2},"c" -> future{3})    
val fut = Future.sequence(map.map(entry => entry._2.map(i => (entry._1,i)))).map(_.toMap)

这个想法是将地图映射到地图关键字的元组的Iterable,并将未来的结果与该密钥相关联。从那里你可以排序该可迭代,然后一旦你拥有总体的未来,将其映射并通过toMap将该可迭代的元组转换为地图。

现在,这种方法的替代方法是尝试和做一些类似于序列功能的工作,并进行了一些调整。你可以编写一个如此的sequenceMap函数:

def sequenceMap[A,B](in: Map[B,Future[A]])(implicit executor: ExecutionContext): Future[Map[B,A]] = {
  val mb = new MapBuilder[B,A,Map[B,A]](Map())
  in.foldLeft(Promise.successful(mb).future) {
    (fr,fa) => for (r <- fr; a <- fa._2.asInstanceOf[Future[A]]) yield (r += ((fa._1,a)))
  } map (_.result)
}

然后在这样的例子中使用它:

val map = Map("a" -> future{1},"c" -> future{3})    
val fut = sequenceMap(map)
fut onComplete{
  case Success(m) => println(m)
  case Failure(ex) => ex.printStackTrace()
}

这可能比第一个例子稍微更有效,因为它创建的中间集合较少,并且对ExecutionContext的匹配较少。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读