gpt4 book ai didi

scala - 同时处理具有重复项的序列

转载 作者:行者123 更新时间:2023-12-01 15:44:48 25 4
gpt4 key购买 nike

假设我有一个函数 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,但我只想运行 fab 一次 em> 用于 as 中的所有重复元素。例如,

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)
}

说明:

  1. as.toSet确保f每个 a 仅调用一次
  2. (a, (a, f(a)))为您提供一组形状为 (a, (a, b)) 的嵌套元组
  3. 映射 a 的原始序列由 Map 提供成对 (a, (a, b))给你一个序列 (a, b)

自从您的 f无论如何都不是异步的,并且由于您不介意使用 futures,因此您可以考虑使用 par -还有集合:

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
}

关于scala - 同时处理具有重复项的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56619493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com