当前位置: 首页 > 知识库问答 >
问题:

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

皮煜
2023-03-14

我对Scala很陌生,请耐心等待。我有一堆包裹在一个大数组中的期货。期货已经完成了他们的辛勤工作,查看了一些TB的数据,在我的应用程序结束时,我想总结所有的结果,这样我就可以很好地展示它们。

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

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

到目前为止,我读到的所有关于理解的东西都表明

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)

按照同样的逻辑,我的意图是这样做,因为我最近发现选项,尝试,失败和成功可以被视为集合:

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

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

错误:(78,15)类型不匹配;
找到:Seq[List(String, String, String)]
必需:scala.concurrent.Future[?]

结果集

带有必需的部分:scala.concurrent.Future[?]完全抛弃了我。我完全不明白为什么那里需要一个未来。

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

在任何人提到之前,是的,我知道理解是一堆地图,平面地图和filters的句法糖。

共有1个答案

王岳
2023-03-14

关于<code>for</code>的<code>如何理解调用<code>flatMap</code>和<code>map</code>的细节在这里很重要。该代码:

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

变得或多或少像这样:

Future.sequence(futures.toSeq).flatMap(futureSeq => futureSeq)

Future 上的 flatMap 需要一个返回 Future 的函数,但您给它一个函数返回一个 Seq[List[(String, String, String)]]

通常,您不能在理解中混合使用类型(序列理解中的选项是隐式转换支持的一种例外)。如果您有

你可能想要这样的东西:

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)

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

 类似资料:
  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的

  • 我遇到了一个关于Scala和多种未来收益的问题。f1和f2都是期货。f2期货基于从f1期货获得的值。 根据 f1 的结果,我要么在 if 语句计算结果为 false 时执行 Lookup(),要么返回 LookupResult),要么模仿默认的 LookupResult。 返回以下错误: 类型不匹配。必需:选项[B_],找到:Future[(MyNode,Any)] 我只是没有正确映射结果吗?例如

  • 我已经在scala shell中单独测试了我的错误代码 我想使用a.\u 1作为键,这样我可以进一步使用join操作符,并且需要(键,值)对。但我的问题是,为什么在使用reduce函数时会有一个required类型?我认为这种形式是由我们自己设定的,而不是有规定的。我错了吗? 此外,如果我错了,那么为什么需要它(String,String,Int)?为什么不是别的? ps:我知道是中的值类型,这是

  • 我有一个从提取的代码,对于多个子类来说,这个代码看起来应该完全相同,所以我尽量避免重复。但是,实际上(见下文),scala认为是一个泛型的,返回的值类型为,当然,它没有和方法。 问题是在这里避免重复的适当方法是什么?我对将转换为字符串并不那么着迷,因为这段代码可以使用刚从字符串解析为AST的json。我开始考虑为我需要的三种类型编写包装器,并将这些类型的匹配和隐式转换器转换为包装器,然后为这些包装

  • 有四种不同的类型:地点、语言、技术和行业。每个类型都有一个存储库,可以返回这些类型的集合。例如位置列表。每个类型都有一个类型为String的name属性。有一个字符串列表。它可以包含位置、语言等名称。我想编写一个函数来查找那些与字符串列表名称匹配的类型实体(位置、语言、...)。我在想这样的事情: 这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?