Что я могу использовать, чтобы написать этот код scala лучше? - PullRequest
1 голос
/ 15 марта 2020
functionThatReturnsATry[Boolean]() match {
      case Success(value) =>
        value match {
          case true => somethingThatReturnsFuture[Unit]
          case false =>
            Failure(new SomeException("This failed here"))
        }
      case Failure(exception) => Failure(exception)
    }

Код вернет Future [Unit], когда functionThatReturnsATry завершится успешно и вернет true.
Если functionThatReturnsATry не удастся, я хочу передать этот отказ вверх по цепочке.
Если functionThatReturnsATry возвращает false, я хочу передать новый sepecifi c сбой по цепочке

Ответы [ 4 ]

5 голосов
/ 15 марта 2020

Одним из улучшений было бы использование защитных выражений на match для разделения трех разных случаев. Вы также должны вернуть Future.failed вместо Failure, чтобы получить результат Future[Unit], а не Any:

functionThatReturnsATry[Boolean]() match {
  case Success(value) if value =>
    somethingThatReturnsFuture[Unit]

  case Success(_) =>
    Future.failed(new SomeException("This failed here"))

  case Failure(exception) =>
    Future.failed(exception)
}
3 голосов
/ 15 марта 2020

Мне нравится существующий ответ, но в качестве альтернативы, если вам не нужно контролировать точное исключение из первого шага, вы можете заключить свой Try в Future и использовать for -понимание :

def attempt(): Try[Boolean] = Success(true)
def soon(): Future[Unit] = Future.failed(new RuntimeException("uh"))

for {
  success <- Future.fromTry(attempt()) if success
  result <- soon()
} yield result

Код доступен здесь на Scast ie.

2 голосов
/ 15 марта 2020
functionThatReturnsATry[Boolean]() match {
  case Success(true) => somethingThatReturnsFuture[Unit]
  case Success(false) => Future.failed(new SomeException("This failed here"))
  case Failure(exception) => Future.failed(exception)
}

https://scalafiddle.io/sf/DSaGvul/0

2 голосов
/ 15 марта 2020

У меня будет соблазн на fold() через Try.

functionThatReturnsATryBool()
  .fold(Future.failed
       ,if (_) somethingThatReturnsFutureUnit()
        else Future.failed(new SomeException("This failed here"))
       )

Результат типа Future[Unit] с любым типом ошибки, возвращаемым как Future(Failure(java.lang.Exception(...))). Без потери сообщения об ошибке.

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