Scala: лучший способ обработки Future.Filter.exists без каких-либо особых условий - PullRequest
0 голосов
/ 13 февраля 2019

Scala: мне нужно выполнить действие, только если предыдущее будущее вернуло Some (x).что может быть лучше, чем использовать приведенный ниже код

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

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

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

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019
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…) }
0 голосов
/ 13 февраля 2019

  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

0 голосов
/ 13 февраля 2019

Лучший способ - вызвать map на Option следующим образом:

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

Это вызовет функцию, только если Future вернет Some(x).Результат с еще одним Future[Option[U]], где U - это результат вашей функции.

Обратите внимание, что он вернет Future(None), если исходный Option был None, тогда как filter будетсгенерировать ошибочное исключение, чтобы они не делали одно и то же.

0 голосов
/ 13 февраля 2019

Вы можете заменить:

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

на:

tryThis.filter(_.isDefined)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...