Scala:在没有任何特定条件的情况下处理Future.Filter.exists的更好方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala:在没有任何特定条件的情况下处理Future.Filter.exists的更好方法相关的知识,希望对你有一定的参考价值。

Scala:我只有在前一次返回Some(x)时才需要执行操作。比使用下面的代码更好的方法是做什么

def tryThis: Future[Option[T]] = {...}

val filteredFuture = tryThis.filter(_.exists(_ => true))

def abc = filteredFuture.map( _ => {...})
答案

最好的方法是在map上调用Option,如下所示:

tryThis.map(_.map(_ => {...}))

只有当Future返回Some(x)时才会调用该函数。结果是另一个Future[Option[U]],其中U是你的功能的结果。

请注意,如果原始Future(None)Option,这将返回None,而filter将生成失败的异常,因此他们不会做同样的事情。

另一答案
def tryThis: Future[Option[T]] = {...}

// Resulting future will be failed if it a None
// and its type will be that of the expression in `x…`
def abc = tryThis collect { case Some(x) => x… }

// Resulting future will be a None if it was a None
// and a Some with the type of the expression in `x…`
def abc = tryThis map { _.map(x => x…) }
另一答案

你可以替换:

tryThis.filter(_.exists(_ => true))

有:

tryThis.filter(_.isDefined)
另一答案

  import scala.concurrent.ExecutionContext.Implicits.global

  def square(a: Int): Future[Option[Int]] = Future.successful(Option(a * a))
  def printResult(a: Int): Unit           = println(s"Result: $a")

  square(2).foreach(_.map(printResult))

编辑:根据@Thilo的建议

以上是关于Scala:在没有任何特定条件的情况下处理Future.Filter.exists的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 在特定条件下返回最新和最长的连续行

Scala单方法接口实现

如何在没有滚动行为的情况下转到特定部分/没有滚动行为的 scrollIntoView() 的任何替代方法?

如果我们在没有任何条件的情况下包含两个表,SQL 查询的输出会是啥

在 Scala 中处理图像 [关闭]

在没有预处理器宏的情况下,有没有办法在 Xcode 项目的项目级别定义实用的方案特定标志