for {
usernameOpt <- lookupUsername("...")
if usernameOpt.isDefined
userOpt <- getUser(usernameOpt.get)
} yield userOpt
は
lookupUsername("...")
.withFilter({ usernameOpt => usernameOpt.isDefined })
.flatMap({ usernameOpt =>
getUser(usernameOpt.get).map({ userOpt =>
userOpt
})
})
Future.withFilter
に変換される(source)のように定義される:
def filter(p: T => Boolean)(implicit executor: ExecutionContext): Future[T] =
map {
r => if (p(r)) r else throw new NoSuchElementException("Future.filter predicate is not satisfied")
}
ので仕事に行くされている単純な変換が存在しません。
私はおそらくのようなもの書くでしょう:あなたはfor
理解の構文を使用する場合は、Future
に明示的なリフトを抽象化しScalaz OptionTのようなモナド変換(例えばcase None => Future.successful(None)
)が必要になります
lookupUsername("...").flatMap({ usernameOpt =>
usernameOpt match {
case None => Future.successful(None)
case Some(username) => getUser(username)
}
})
を:
import scalaz._
import Scalaz._
import scalaz.OptionT._
val maybeUserFut: Future[Option[User]] =
(for {
username <- optionT(lookupUsername("..."))
user <- optionT(getUser(username))
} yield user).run
http://stackoverflow.com/questions/17869624/scala-future-with-filter-in-for-comprehension –