我对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的句法糖。
关于<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属性是否存在呢?