Учитывая Option[Future[Option[Int]]]
:Опция [Future [Опция [Int]]] => Future [Опция [Int]]
scala> val x: Option[Future[Option[Int]]] = Some (Future (Some (10)))
x: Option[scala.concurrent.Future[Option[Int]]] =
Some([email protected])
Я хочу Future[Option[Int]]
.
Я матч шаблон (или использовать Option#getOrElse
):
scala> x match {
| case Some(f) => f
| case None => Future { None }
| }
res6: scala.concurrent.Future[Option[Int]] =
[email protected]
scala> res6.value
res7: Option[scala.util.Try[Option[Int]]] = Some(Success(Some(10)))
Но, есть функция высшего порядка, который будет делать эту работу?
Я думал использовать sequence
, но не имеют внешний вид List
:
> :t sequence
sequence :: Monad m => [m a] -> m [a]
Если вы просто очищаете внешний слой, почему бы просто не использовать 'x.getOrElse (Future {None})'? – jwvh
FYI 'Future.successful (None)' - небольшая оптимизация над 'Future {None}' в этом случае. – Ryan
Что означает «небольшая оптимизация»? С идиоматической точки зрения Scala? –