gpt4 book ai didi

scala - Scala 上的类型不匹配用于理解 : scala. concurrent.Future

转载 作者:行者123 更新时间:2023-12-01 03:40:18 27 4
gpt4 key购买 nike

我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结果,以便我可以很好地呈现它们。

我拥有的 future 集合属于以下类型:

Array[Future[List(String, String, String)]]

到目前为止,我所读到的关于 for-comprehension 的所有内容都表明
val test: Seq[Seq[List[String]]] = Seq(Seq(List("Hello", "World"), List("What's", "Up")))

val results = for {
test1 <- test
test2 <- test1
test3 <- test2
} yield test3

结果是
results: Seq[String] = List(Hello, World, What's, Up)

按照同样的逻辑,我的意图是这样做,因为我最近发现 Option、Try、Failure 和 Success 可以被视为集合:
val futures = { ... } // Logic that collects my Futures

// futures is now Array[Future[List(String, String, String)]]

val results = for {
// futureSeq as Seq[List(String, String, String]
futureSeq <- Future.sequence(futures.toSeq)
// resultSet as List(String, String, String)
resultSet <- futureSeq
} yield resultset

但这行不通。我似乎收到以下编译错误:

Error:(78, 15) type mismatch;
found : Seq[List(String, String, String)]
required: scala.concurrent.Future[?]

resultSet <- futureSeq ^



需要的部分: scala.concurrent.Future[?] 完全让我失望。我完全不明白为什么那里需要一个 Future 。

我已经通过 REPL、调试和使用 IntelliJ 的类型检查检查了所有对象的类型。他们似乎证实我不只是对我的类型感到困惑。

在任何人提到之前,是的,我知道 for-comprehension 是一堆 map 、flatMaps 和 withFilters 的语法糖。

最佳答案

详情如何for - 对调用 flatMap 的理解脱糖和 map在这里很重要。这段代码:

for {
futureSeq <- Future.sequence(futures.toSeq)
resultSet <- futureSeq
} yield resultset

或多或少变成这样:
Future.sequence(futures.toSeq).flatMap(futureSeq => futureSeq)
flatMapFuture期望一个返回 Future 的函数,但你给了它一个返回 Seq[List[(String, String, String)]] .

通常,您不能在 for 中混合类型-comprehensions(序列推导式中的 Option 是一种隐式转换支持的异常)。如果您有 <-从 future 射出的箭,你所有其余的 <-箭头需要从 future 中出来。

你可能想要这样的东西:
val results: Future[Seq[(String, String, String)]] =
Future.sequence(futures.toSeq).map(_.flatten)

然后你可以使用这样的东西:
import scala.concurrent.Await
import scala.concurrent.duration._

Await.result(results.map(_.map(doSomethingWithResult)), 2.seconds)

同步呈现结果(阻塞直到完成)。

关于scala - Scala 上的类型不匹配用于理解 : scala. concurrent.Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364888/

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