Нет, flatMap
не удаляется Option
. Это ошибочное, но распространенное мнение, навел тот факт, что существует неявное преобразование из Option
в Traversable
, что позволяет сделать, чтобы такие вещи, как List(Option(1)).flatMap(x => x)
(по существу .flatten
.)
Вместо этого, думайте о flatMap
так же, как вы могли бы сделать с чем-то более похожим на Монаду. Учитывая некоторый тип M[_]
и функцию типа A => M[B]
, произведите M[B]
. Итак, для flatMap
для работы в этом случае вам нужно будет иметь функцию типа Option[User] => Future[B]
для некоторого типа B
.
def doSomething(ouser: Option[User]): Future[Output] = { ...
val res: Future[Output] = futOptUser.flatMap(doSomething)
Я хочу вариант [User], как мой конечный результат. –
Я не уверен, что «подумайте о FlatMap так же, как вы бы сделали с чем-то более похожим на Monad», - это правильный ответ человеку, который думал о «FlatMap» как о том, что «удаляет» «Option». – ziggystar
@ziggystar Как бы вы так выразились? Самая большая проблема - это глупое неявное преобразование. Это действительно путает проблему на многих фронтах. – wheaties