我有一個方法load
,這是相對昂貴的調用。爲了在加載期間允許某種異常處理,返回Try
。我現在需要一個針對loadAll
方法的實現,該方法對於給定的每個鍵基本上委託load
。這是我的第一個方法,但是我不知道這是否與Try
有關的最佳實踐。有沒有更好的方法來實現以下目標?Iterable [嘗試[(K,V)]]嘗試[地圖[K,V]]
def load(key: K): Try[V] // very expensive
def loadAll(keys: Traversable[K]): Try[Map[K, V]] = {
// remove duplicate keys
val ukeys = Set.empty ++ keys
val result: Iterable[Try[(K, V)]] = ukeys map { key =>
load(key) match {
case Success(value) => Success(key, value)
case Failure(exception) => Failure(exception)
}
}
Try(result.map { _.get }.toMap)
}
謝謝!它應該被映射爲'Tuple [K,V]'作爲'(k,load(k).get)'。我是對的,它迭代了3次以上的鍵(toSet','map'和'toMap')? – 2013-04-30 05:59:55
@ManuelSchmidt - 我已經調整了答案以返回一個元組。這在鍵上重複三次;如果'load'昂貴,那麼你不關心,因爲'load'主宰了所有其他的搗蛋。 – 2013-04-30 14:22:20