Future.apply
создает новое будущее и планирует его запуск в контексте выполнения, что действительно дорого, так что вы правы, это не лучшее решение.
Вместо Future.apply
вы можете простоиспользуйте Future.sucessful
, который создает уже разрешенную Future
и является очень дешевой операцией. Вы также можете сделать свой код (возможно) более читабельным с помощью сопоставления с образцом и для понимания:
for{
m1 <- method1()
result <- m1 match {
case x @ Some(_) => Future.successful(x) //just lifts value into Future context
case None => method2()
}
} yield result
Вы также можете использовать плоскую карту с сопоставлением с образцом:
method1().flatMap{
case x @ Some(_) => Future.successful(x)
case None => method2()
}
Другое решениевы могли бы рассмотреть использование монадного преобразователя OptionT
, который упрощает операции со вложенным стеком монад, например Future[Option[T]]
. И scalaz , и cats предоставляют свои собственные реализации OptionT
. Ниже приведен пример с cats
:
import cats.data.OptionT
import cats.implicits._
OptionT(method1()).orElseF(method2()).value