Scala - Как вернуть значение простого необработанного типа с плоской карты? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть простой код, в котором я хочу получить только одно значение boolean, но оно содержится в Future объекте:

def getValue(arg: String) : Boolean = for {
    data <- SomeObject.getData(arg) //SomeObject is in class constructor 
    value = data.getBooleanValue
} yield value

Проблема в том, что мне нужно вернуть Future[Boolean] вместо простого boolean. Как я мог изменить его, чтобы он возвращал только необработанный тип?

1 Ответ

3 голосов
/ 01 апреля 2020

Как только вы вызываете API, который возвращает Future, вам необходимо объединить свой код в цепочку для выполнения, когда этот Future завершится настолько, насколько возможно. Старайтесь не ждать, пока Future завершится как можно дольше.

Поэтому измените метод так, чтобы он возвращал Future:

def getValue(arg: String): Future[Boolean] =
  SomeObject.getData(arg).map(_.getBooleanValue)

Тогда вместо вызова

nextMethod(getValue(myArg))

Используйте map на Future следующим образом:

getValue(myArg).map{ bool =>
  nextMethod(bool) // next processing step
}

Это даст новый Future, который будет содержать результат следующего шага обработки.

Пока это требует повторной обработки вызывающего кода, Scala делает этот вид кода очень простым для написания. Продолжайте связывать операции с предыдущим Future до тех пор, пока обработка не будет завершена.

В большинстве случаев код заканчивается побочной операцией, такой как отправка сообщения или запись файла, и в этом случае не нужно ждать завершения Future.

В редких случаях, когда вам нужно дождаться Future, используйте Await.result, чтобы восстановить окончательный результат цепочки Future s

...