Scala проверяет, является ли Future[Seq[String]] пустым
Я хотел бы проверить, является ли будущее[Seq[String]] пустым, и я использую
if(!Future.sequence(sortSeq).isEmpty){
//doSomething
}
Но это бросает мне ошибку ?
2 ответа:
Я полагаю, что тип
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
Future.sequenceметод используется для преобразованияTraversableOnce[Future[A]]вFuture[TraversableOnce[A]].Я думаю, что вы можете забыть, является ли
Seqпустым или нет, и просто работать сSeq, используя функциюmapFutureval 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.С непустым
Seqscala> 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С пустым
Seqscala> 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 } }Надеюсь, это поможет.