В Scala, как вы используете значение Future до его использования? - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь использовать значения, сгенерированные 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 Futures?

Кандидатское решение:

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

1 Ответ

4 голосов
/ 26 марта 2019

Вы имели в виду что-то вроде этого:

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)

, если вы хотите, чтобы оно было действительно кратким.

...