我想检查一下Future [Seq [String]]是否为空,我正在使用
if(!Future.sequence(sortSeq).isEmpty){
//doSomething
}
但它会引发我的错误?
答案 0 :(得分:3)
我认为sortSeq
的类型为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
答案 1 :(得分:0)
Future.sequence
方法用于将TraversableOnce[Future[A]]
转换为Future[TraversableOnce[A]]
。
我认为您可以忘记Seq
是否为空,只使用Seq
使用map
的{{1}}功能
Future
这是有效的,因为空检查是在后台隐式执行的。在下面的示例中,当 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>)
希望这有帮助。