在Scala中,如何在使用Future之前使用其价值?

时间:2019-03-26 00:15:26

标签: scala future

我正在尝试使用Scala Future生成的值:

val x = for (i <- 0 until 100) yield Future(Random.nextInt(arraySize))

对于x的每个值,我想索引到一个数组中:

val y = for (j <- x) yield myArray(j) // doesn't work
val y2 = x map (j => myArray(j)) // doesn't work

myArray只能以int形式访问。 Scala期货如何做到这一点?

候选解决方案:

val y3 = x.map{ future => future.map(j => myArray(j) }

1 个答案:

答案 0 :(得分:4)

您的意思是这样的吗?

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits._
import java.util.concurrent.ThreadLocalRandom

val arraySize = 100
val myArray: Vector[String] = Vector.fill(arraySize)("")

val x: Future[IndexedSeq[Int]] = Future.sequence((0 until 100).map{ 
  i => 
  Future(ThreadLocalRandom.current.nextInt(arraySize))
})

val y: Future[IndexedSeq[String]] = for {
  indices <- x                                   // Future's `map`
} yield for {
  i <- indices                                   // IndexedSeq's `map`
} yield myArray(i)

最后一个双for表达式也可以改写为

x map (_ map myArray)

如果您真的想要它简洁。