Scala для понимания с Future [Option] без исключений - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть одна функция Future [Option [String]].Мне нужно получить преобразованную строку, только если будущее было успешным и строка существует.В других случаях мне нужно получить только None (без каких-либо ошибок или исключений)

Я пытался использовать для понимания (а также карты / flatMaps), но, очевидно, мой результат - тип Nothing вместо Option [String].

def getOption: Option[String]
def getOptionResult: Future[Option[String]]
def someActions: String

val resultO: Option[String] = for {
  myString: String <- getOption
  optionResult: Option[String] <- getOptionResult
  result: String <- optionResult
} yield {
  someActions(result)
}

Какой самый элегантный способ справиться с такими ситуациями?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018
getOptionResult.recover { case _ => None }

, если я правильно понял ваше требование.Это даст всегда успешное будущее, которое будет иметь тот же результат, что и getOptionResult в случае успеха и None в случае неудачи.См. документы .

Обычно вы не хотите указывать типы слева от <-, это совсем не работает, как указание их для val/var/def, но вместо этого превращается в сопоставление с шаблоном.

0 голосов
/ 27 декабря 2018

попробуйте

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

 def getOptionResult: Future[Option[String]] = Future(Some("Foo"))
 //    def getOptionResult: Future[Option[String]] = Future(None)

val d = getOptionResult.map(a => a.map(r => "(" + r + ")"))

val res = Await.result(d, 100 nanos).getOrElse(None)
...