2013-04-04 46 views

回答

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]] = [email protected] 

scala> Await.result(sortSeq.map{_.isEmpty}, 11.seconds) 
res1: Boolean = false 
+0

它会引发一个错误: – 2013-04-04 05:55:22

+0

请注意,隐式转换不适用,因为它们不明确: [error] both method any2在类型为[A](x:A)的对象Predef中确保确保[A] [error] and method any2ArrowAssoc在类型为[A](x:A)的对象Predef中,ArrowAssoc [A] [错误]可能是scala.concurrent.Future [Seq [String]]中的转换函数到?M [错误]发现一个错误 – 2013-04-04 05:56:00

+0

@princessofpersia :sortSeq的类型是什么? – senia 2013-04-04 05:57:59

0

Future.sequence方法用于一个TraversableOnce[Future[A]]转变为Future[TraversableOnce[A]]

我想你可以忘记Seq是否为空或不使用的Future

val s = Future[Seq[String]](Seq("s", "e", "q")) 
    val p = s.map(s => s.foreach(println)) 

map功能这样做是因为,在后台隐式执行空管检查与Seq只是工作。在下面的例子中,当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 
    } 
} 

希望这有助于。