Scala检查Future[Seq[String]]是否为空

Scala检查Future[Seq[String]]是否为空,scala,future,sequences,Scala,Future,Sequences,我想检查Future[Seq[String]]是否为空,并且我正在使用 if(!Future.sequence(sortSeq).isEmpty){ //doSomething } 但是它给我带来了错误?我想sortSeq的类型是Future[Seq[String]],所以您不需要Future.sequence 您必须等待未来的结果,然后检查结果是否为空: import scala.concurrent.duration._ if(!Await.result(sortSeq.map{_.isE

我想检查Future[Seq[String]]是否为空,并且我正在使用

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

但是它给我带来了错误?

我想
sortSeq
的类型是
Future[Seq[String]]
,所以您不需要
Future.sequence

您必须等待未来的
结果,然后检查结果是否为空:

import scala.concurrent.duration._
if(!Await.result(sortSeq.map{_.isEmpty}, 5.seconds){
  //doSomething
}
如果您可以在不同的线程中执行
doSomething
,您可以尝试以下方法:

val someRusultFuture = sortSeq.map{ rs =>
  if(!rs.isEmpty){
    //doSomething
  }
}
但您必须等待
somersultfuture
的结果

证明它有效:

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
是否为空,只需使用
Future
map
功能处理
Seq

  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>)
带有空的
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
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>)

希望这有帮助。

sortSeq的类型是什么?是Seq[Future[String]]吗?请注意,隐式转换不适用,因为它们是不明确的:[error]在[A](x:A)类型的对象Predef中确保[A][error]的方法any2Ensuring和[A](x:A)类型的对象Predef中的方法any2ArrowAssoc[A][error error都是scala.concurrent.Future[Seq[String]中可能的转换函数]到?M[错误]一个错误found@princessofpersia当前位置sortSeq的类型是什么?是的,我也试过了,不起作用。sortSeq是Future[Seq[String]]类型,我想检查这个序列是否为空。@princessofpersia:它工作正常,我添加了代码示例。我想错误在代码的其他地方。
val someRusultFuture = sortSeq.map{ rs =>
  if(!rs.isEmpty){
    //doSomething
  }
}