将字符串`Seq [String]`的序列与未来的字符串集'Future [Set [String]]`相交

时间:2016-03-15 15:04:49

标签: scala

我想知道两个集合之间是否存在共同元素, 如果不是因为我会做的Future问题:

  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在保持其返回类型完好无损的情况下工作?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

为了访问Future中包含的值,您可以像Angelo所指出的那样使用map之类的函数。 map上的Future[A]将参数作为函数A => B并返回Future[B](您可以在Future {{3}上找到有关其他方法的更多信息})。

请注意,为了mapflatMap等未来,您需要implicit ExecutionContext。这将告知编译器谁将负责映射函数的异步执行(因为它是异步执行的,它不在您的进程运行的同一个线程上)。在大多数情况下,您可以通过键入import scala.concurrent.ExecutionContext.Implicits.global来使用here(这会将其放在范围内)。但是YMMV取决于您的应用程序需求,您可能需要使用语法ExecutionContext声明专用ExecutorService(例如来自Java implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(javaExecutor)