我想知道两个集合之间是否存在共同元素,
如果不是因为我会做的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
在保持其返回类型完好无损的情况下工作?
答案 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}上找到有关其他方法的更多信息})。
请注意,为了map
,flatMap
等未来,您需要implicit ExecutionContext
。这将告知编译器谁将负责映射函数的异步执行(因为它是异步执行的,它不在您的进程运行的同一个线程上)。在大多数情况下,您可以通过键入import scala.concurrent.ExecutionContext.Implicits.global
来使用here(这会将其放在范围内)。但是YMMV取决于您的应用程序需求,您可能需要使用语法ExecutionContext
声明专用ExecutorService
(例如来自Java implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(javaExecutor)
。