Ich würde gerne über einen Vektor, den ich aus einer Zukunft bekomme. Ich möchte, dass das Folgende funktioniert, aber es gibt einen Typenkonflikt-Compiler-Fehler in der Zeile user <- usersToReview
.Mischen von Futures und Vektoren in einem für das Verständnis
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
object Main3 {
var counter = 0
val fUsersToReview: Future[Vector[String]] = Future {Vector("u1", "u2", "u3")}
def doIt(user: String): Future[Int] = {
counter = counter + 1
Future.successful(counter)
}
def main(args: Array[String]): Unit = {
val result:Future[Vector[Int]] = for {
usersToReview ← fUsersToReview
user ← usersToReview
msg_id ← doIt(user)
} yield {
msg_id
}
println(Await.result(result, 1.second))
}
}
Folgendes funktioniert, wirkt aber sehr klobig. Vorschläge zur Verbesserung? Diese
def main(args: Array[String]): Unit = {
val result:Future[Vector[Int]] = (for {
usersToReview ← fUsersToReview
} yield {
Future.sequence(
for (u ← usersToReview) yield {
doIt(u)
}
)
}).flatMap(identity)
println(Await.result(result, 1.second))
}
}
Dieses schöne ist, außer dass doit eine zukünftige Entwicklung. Der Rückgabetyp dieser Lösung ist also tatsächlich Future [Vector [Future [Int]]]. Ich denke, was ich gelernt habe ist, dass die Metapher eines For-Verständnisses wie eine verschachtelte Schleife zusammenbricht. Eine verschachtelte Schleife kann über Integer in einer Schleife und Zeichen in einer anderen Schleife iterieren, aber bei Nachvollzählungen müssen Sie den Typ auswählen und konsistent sein. Wenn Sie das nicht können, brechen Sie die Maps und FlatMaps aus (oder suchen Sie nach Möglichkeiten, Ihre Typen zu konvertieren). – bwbecker