Future[Seq[String]] が空で、使用しているかどうかを確認したい
if(!Future.sequence(sortSeq).isEmpty){
//doSomething
}
しかし、それは私にエラーをスローしますか?
の型はsortSeqisだと思いFuture[Seq[String]]ますので、 は必要ありませんFuture.sequence。
結果を待ってからFuture、結果が空かどうかを確認する必要があります。
import scala.concurrent.duration._
if(!Await.result(sortSeq.map{_.isEmpty}, 5.seconds){
//doSomething
}
doSomething別のスレッドで実行できる場合は、これを試すことができます。
val someRusultFuture = sortSeq.map{ rs =>
if(!rs.isEmpty){
//doSomething
}
}
の結果を待つ必要がありますsomeRusultFuture。
動作することの証明:
scala> import concurrent.{Future, Await}
import concurrent.{Future, Await}
scala> import scala.concurrent.duration._
import scala.concurrent.duration._
scala> val sortSeq = Future{ Thread.sleep(10000); Seq("a") }
sortSeq: scala.concurrent.Future[Seq[String]] = scala.concurrent.impl.Promise$DefaultPromise@3592f7c6
scala> Await.result(sortSeq.map{_.isEmpty}, 11.seconds)
res1: Boolean = false
Future.sequenceメソッドを使用して、 を に変換TraversableOnce[Future[A]]しFuture[TraversableOnce[A]]ます。
Seqが空かどうかを忘れて、 の機能をSeq使用して操作できると思いますmapFuture
val s = Future[Seq[String]](Seq("s", "e", "q"))
val p = s.map(s => s.foreach(println))
これが機能するのは、空のチェックがバックグラウンドで暗黙的に実行されるためです。以下の例では、Seqが空の場合、何も出力されません。
scala> val s = Future[Seq[String]](Seq.empty)
s: scala.concurrent.Future[Seq[String]] = Future(<not completed>)
scala> val p = s.map(s => s.foreach(println))
p: scala.concurrent.Future[Unit] = Future(<not completed>)
本当に空のチェックを実行したい場合は、も使用できますwithFilter。
空でない場合Seq
scala> val s = Future[Seq[String]](Seq("s", "e", "q"))
s: scala.concurrent.Future[Seq[String]] = Future(Success(List(s, e, q)))
scala> val p = s.withFilter(_.nonEmpty).map(s => s.foreach(println))
p: scala.concurrent.Future[Unit] = Future(<not completed>)
s
e
q
空のSeq
scala> val s = Future[Seq[String]](Seq.empty)
s: scala.concurrent.Future[Seq[String]] = Future(Success(List()))
scala> val p = s.withFilter(_.nonEmpty).map(s => s.foreach(println))
p: scala.concurrent.Future[Unit] = Future(<not completed>)
また、上記の回答で述べたように空のチェックを行うこともできます
val someRusultFuture = sortSeq.map{ rs =>
if(!rs.isEmpty){
//doSomething
}
}
お役に立てれば。