2

Future[Seq[String]] が空で、使用しているかどうかを確認したい

if(!Future.sequence(sortSeq).isEmpty){
//doSomething
}

しかし、それは私にエラーをスローしますか?

4

2 に答える 2

3

の型は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
于 2013-04-04T05:28:51.450 に答える
0

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
  }
}

お役に立てれば。

于 2017-06-16T11:44:36.827 に答える