[英]Processing sequence with duplicates concurrently
假设我有一个函数fab: A => B
,一个A
序列,并且需要得到一对对(A, B)
像这样:
def foo(fab: A => B, as: Seq[A]): Seq[(A, B)] = as.zip(as.map(fab))
现在,我想使用scala.concurrent.Future
同时运行fab
但是对于as
所有重复元素,我只希望运行一次 fab
。 例如,
val fab: A => B = ...
val a1: A = ...
val a2: A = ...
val as = a1 :: a1 :: a2 :: a1 :: a2 :: Nil
foo(fab, as) // invokes fab twice and run these invocations concurrently
您将如何实施?
def foo[A, B](as: Seq[A])(f: A => B)(implicit exc: ExecutionContext)
: Future[Seq[(A, B)]] = {
Future
.traverse(as.toSet)(a => Future((a, (a, f(a)))))
.map(abs => as map abs.toMap)
}
说明:
as.toSet
确保每个a
仅对f
调用一次 (a, (a, f(a)))
为您提供了一组嵌套形状为(a, (a, b))
元组 a
由A S Map
与对(a, (a, b))
为您提供的序列(a, b)
秒。 由于您的f
无论如何都不是异步的,并且由于您不介意使用期货,因此您也可以考虑使用par
-collections:
def foo2[A, B](as: Seq[A])(f: A => B): Seq[(A, B)] = {
as map as.toSet.par.map((a: A) => a -> (a, f(a))).seq.toMap
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.