2016-03-15 63 views
0

我想知道两个集合之间是否存在共同元素,如果 不是Future问题,我会做:字符串`Seq [String]`与将来的字符串集合`Future [Set [String]]'相交的序列'

def isThere(user: User, anyOf: String*): Future[Boolean] = { 
    if(anyOf.nonEmpty) anyOf.intersect(user.getStuff.toSeq).nonEmpty 
    else true 

但是,这是行不通的,因为getStuff返回类型Future[Set[String]]何况Future[Boolean]问题的整个返回类型。

如何才能让isThere工作,同时保持它的返回类型完好无损?

+0

您能给例如输入和预期输出也 - ?请出示'User'”定义 –

回答

1

您需要映射了未来的应用功能,它的结果

case class User(getStuff: Future[Set[String]]) 

def isThere(user: User, anyOf: String*): Future[Boolean] = { 
    if(anyOf.nonEmpty) user.getStuff.map(stuff => anyOf.intersect(stuff.toSeq).nonEmpty) 
    else Future.successful(true) 
} 

或者:

def isThere(user: User, anyOf: String*): Future[Boolean] = 
    user.getStuff.map {stuff => 
    if(anyOf.nonEmpty) anyOf.intersect(stuff.toSeq).nonEmpty 
    else true 
} 
+2

'Future.successful(true)'比'Future(true)'更好,因为前面将创建一个已经完成的Future,而不是像未来一样创造未来,并且像'true'一样异步完成它。 – manub

+0

好点,在答案中解决。 –

1

为了包含在Future访问值,您可以使用函数像map正如Angelo指出的那样。 mapFuture[A]作为参数功能A => B并返回Future[B](您可以在Futurehere上找到有关其他方法的更多信息)。

请注意,为了map,flatMap等未来您将需要一个implicit ExecutionContext。这将通知编译器谁将负责异步执行你的map函数(因为它是异步执行的,它不在你的进程运行的同一线程中)。在大多数情况下,您可以通过输入import scala.concurrent.ExecutionContext.Implicits.global来使用global implicit execution context(这将使其处于范围内)。但情况因人而异根据您的应用需求,您可能需要声明一个奉献ExecutionContext(例如从Java ExecutorService使用语法implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(javaExecutor)

相关问题