Scala 如何在 hashmap 项上调用 future 函数
Scala how to call a future function on hashmap items
我有一个散列映射 map: Map[A, Seq[B]]
,我想为映射中的每个 B
调用一个未来函数(即 returns 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。任何提示将不胜感激
我们可以像 List
这样的任何其他集合一样映射 HashMap
m.flatMap({ case (key, values) => values.map(f(_, key)) })
其中 m: Map[A, Seq[B]]
和 f: (B, A) => Future[Unit]
。这 returns Iterable[Future[Unit]]
所以我们可以使用 Future.sequence
反转为 Future[Iterable[Unit]]
m
.flatMap({ case (key, values) => values.map(f(_, key)) })
.pipe(Future.sequence(_))
Futures 在内部使用 Try
表示 success/failure,我们可以使用 transform
和 toEither
convert 到 Either
[=30] =]
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]]
其中 returns 所需的 Future[Either[Error, Unit]]
类型。 pipe
方法来自 import util.chaining._
个人感觉,从Map[A, Seq[B]]
到Future[Either[Error, Unit]]
的转变,感觉有点可疑。
我有一个散列映射 map: Map[A, Seq[B]]
,我想为映射中的每个 B
调用一个未来函数(即 returns 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。任何提示将不胜感激
我们可以像 List
HashMap
m.flatMap({ case (key, values) => values.map(f(_, key)) })
其中 m: Map[A, Seq[B]]
和 f: (B, A) => Future[Unit]
。这 returns Iterable[Future[Unit]]
所以我们可以使用 Future.sequence
反转为 Future[Iterable[Unit]]
m
.flatMap({ case (key, values) => values.map(f(_, key)) })
.pipe(Future.sequence(_))
Futures 在内部使用 Try
表示 success/failure,我们可以使用 transform
和 toEither
convert 到 Either
[=30] =]
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]]
其中 returns 所需的 Future[Either[Error, Unit]]
类型。 pipe
方法来自 import util.chaining._
个人感觉,从Map[A, Seq[B]]
到Future[Either[Error, Unit]]
的转变,感觉有点可疑。