Как аккуратно справиться с вложенным будущим [Опция [A]]

#scala #future

#scala #будущее

Вопрос:

Я думаю, что это, вероятно, простой вопрос, но я действительно изо всех сил пытаюсь разобраться в нем правильно, у меня есть следующие функции:

 def getInfo(identifier: Int): Future[Option[Info]]

def deleteInfo(info: Info): Future[Bool]
  

Я пытаюсь реализовать следующее:

 def deleteInfoByID(identifier: Int): Future[Bool]
  

Мне интересно, какой самый чистый способ сделать это? Я попробовал несколько вариантов map и flatMap, но, похоже, я не могу распространить результат deleteInfo обратно наверх:

 def deleteInfoByID(identifier: Int): Future[Bool]
    getInfo(identifier).map { infoOpt: Option[Info] =>
      infoOpt.map { info =>
        deleteInfoByID(identifier)
      }
    }
  

Комментарии:

1. Какое значение должно быть возвращаемым, deleteInfoByID если не было найдено никакой информации ? false ? — Кроме того, в то время как нет ничего плохого в том, что Future[Option[A]] некоторые люди предпочли бы просто использовать Future[A] и генерировать пользовательское исключение, если A отсутствует. Я предпочитаю Option , но вас может заинтересовать эта альтернатива.

Ответ №1:

Вам следует скорее flatMap :

 def deleteInfoByID(identifier: Int): Future[Bool]
  getInfo(identifier).flatMap {
    case Some(id) => deleteInfoByID(id)
    case _ => Future.successful(false)
  }
  

Ответ №2:

Я фанат fold() .

 def deleteInfoByID(identifier: Int): Future[Boolean] =
  getInfo(identifier)
    .flatMap(_.fold(Future.successful(false))(deleteInfo))