我正在intellij-idea中使用Scala语言编写此代码
def observeWinner(a: Future[Tuple2[String, Float]], b: Future[Tuple2[String, Float]]) = {
if (a._2 < b._2) {
println(s"New leader: ${b._1}, score: ${b._2}")
b
} else {
a
}
}
我收到以下错误:
value _2 is not a member of scala.concurrent.Future[(String, Float)]
[error] println(s"New leader: ${b._1}, score: ${b._2}")
符号<和_也无法解析
我该怎么办?任何帮助将不胜感激
答案 0 :(得分:1)
如错误所述,a
是Future
,而您正试图像使用Tuple2
一样使用它。 ._2
方法仅适用于元组。
这是一种做想做的事的方式:
for { aa <- a; bb <- b } yield {
if (aa._2 < bb._2) {
println(s"New leader: ${bb._1}, score: ${bb._2}")
bb
} else {
aa
}
}
通过理解,可以从期货中提取价值,您可以确保只有两个Future
成功了,您的代码才能工作,否则就什么都不做。
答案 1 :(得分:0)
您需要在Future
内工作,并从您的方法中返回Future
。像这样:
def observeWinner(a: Future[(String, Float)], b: Future[(String, Float)])(implicit ec: ExecutionContext): Future[(String, Float)] = {
for {
x <- a
y <- b
} yield {
if (x._2 < y._2) {
println(s"New leader: ${y._1}, score: ${y._2}")
y
} else {
x
}
}
}
请注意,这与写作相同:
def observeWinner(a: Future[(String, Float)], b: Future[(String, Float)])(implicit ec: ExecutionContext): Future[(String, Float)] = {
a.flatMap { x =>
b.map { y =>
if (x._2 < y._2) {
println(s"New leader: ${y._1}, score: ${y._2}")
y
} else {
x
}
}
}
}
还要注意,您必须传递ExecutionContext
(通常是隐式的)。如果您暂时不确定,可以import scala.concurrent.ExecutionContext.Implicits.global
来解决。但是,实际上不建议将其用于生产代码。