因此...可以說我有一個Future[ List[ A ] ]
,我想要的是一個Future
,其中包含所包含的list
的first element
。從未來[列表[A]]得到未來的首選方式
考慮到這是db訪問層的一部分,可以這樣做的首選方式是什麼?
def getFirstByName(name: String): Future[ A ] = {
val aListFuture = ...
// somehow got the future of list of all A's for this name
// Now how do I return a Future[ A ] contaning the head of said list
}
這個問題的焦點更多的是對Considering this is a part of the db access layer what can be the preferred way of doing this ?
。
我們可以按照如下方法做val aFuture = aListFuture.map(l => l.head)
,但如果列表爲空,該怎麼辦?
在這個問題中,我真正在尋找的是「如何設計一個可預測的解決方案?」。
是否有任何其他選擇而不是優雅地失敗與域特定異常?如果不是,我該如何實施這樣的失敗?
我目前使用這個下面骯髒的伎倆,
def getFirstByName(name: String): Future[ A ] = {
// somehow got the future of list of all A's for this name
val aListFuture = ...
aListFuture map(_.head) match {
case Some(t: Try[ A ]) => t match {
case Success(a: A) => Promise.successful(a).future
case Failure(e: NoSuchElementException) => Promise.failed(DbNotFound).future
case Failure(e) => Promise.failed(e).future
}
case _ => Promise.failed(new Exception("Some unexplained exception")).future
}
}
爲什麼不改變函數的返回類型? –
@FatihDonmez呃......這個問題本身就是一個錯誤。我需要這樣做。 –
考慮如果列表爲空則該怎麼辦。 –