J'ai une méthode load
qui est relativement coûteuse à appeler. Afin de permettre une sorte de gestion des exceptions pendant le chargement, il retourne un Try
. J'ai maintenant besoin d'une implémentation pour la méthode loadAll
qui délègue essentiellement à load
pour chacune des clés données. Voici ma première approche, mais je ne sais pas si ce sont les meilleures pratiques en ce qui concerne le travail avec Try
. Y a-t-il un meilleur moyen de réaliser ce qui suit?Iterable [Essayez [(K, V)]] pour essayer [Carte [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)
}
Merci! Il devrait juste être mappé sur un 'Tuple [K, V]' comme '(k, load (k) .get)'. Ai-je raison de dire que cela se répète 3 fois sur les touches (une fois pour 'toSet',' map' et 'toMap')? –
@ManuelSchmidt - J'ai ajusté la réponse pour retourner un tuple. Cela ne fait que répéter trois fois les touches; si «charger» est cher, alors vous ne vous souciez pas de «charger» qui domine tous les autres. –