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的匹配较少。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |