Scala:值_2不是scala.concurent.Future [(String,Float)]的成员

时间:2018-09-04 16:39:56

标签: scala

我正在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}")

符号<和_也无法解析

我该怎么办?任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

如错误所述,aFuture,而您正试图像使用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来解决。但是,实际上不建议将其用于生产代码。