Comment convertir facilement SEQ [Essayez [Option [String, n'importe quel]]]]]
Si vous essayez avant de convertir une exception, l'essai converti devrait également lancer. P>
5 Réponses :
Voici quelque chose qui n'est pas très propre mais peut vous aider à démarrer. Il suppose foo.scala strong> p> exemple de session p> option [(chaîne, n'importe quel)] code>, renvoie la première échec code> s'il y en a dans l'entrée SEQ code> et juste gouttes Aucun code> éléments.
Les solutions suivantes sont basées sur Cette réponse au point que presque em> fait la question un duplicata. Méthode 1: Utilisation de la récursion p> def trySeqToMap2[X,Y](trySeq : LazyList[Try[Option[(X, Y)]]], m : Map[X,Y]= Map.empty[X,Y]) : Try[Option[Map[X,Y]]] =
trySeq match {
case Success(Some(h)) #:: tail => trySeqToMap2(tail, m + (h._1 -> h._2))
case Success(None) #:: tail => tail => trySeqToMap2(tail, m)
case Failure(f) #:: _ => Failure(f)
case _ => Success(Some(m))
}
Si vous êtes prêt à utiliser une bibliothèque de support fonctionnelle comme chats puis il y a deux astuces qui peuvent Aidez-y le long:
Beaucoup de choses comme Presque tous les types de conteneurs prennent en charge une méthode code> de la carte de code> qui peut fonctionner sur le contenu d'un conteneur, de sorte que si vous avez une fonction de CATS ne prend pas directement en charge étant donné que la signature de type, vous pouvez itérativement la séquence code> l'élément que vous devez En effet, appuyez sur la liste Type d'un niveau dans la chaîne de type, puis https: // scastie.scala-lang.org/xbq8zbkorscxgdjx0pgjaq a un exemple légèrement plus complet. p> p> Liste code> et Essayez code> sont Traversable , ce qui signifie que (si les implicites de CATS sont dans la portée), ils ont une méthode de séquence de code> pouvant échanger deux types, par exemple convertir la liste [essayer [ T]]] code> à essayer [liste [t]] code> (omet de défaut si l'un des éléments de la liste est une défaillance). P> li>
A code> à < Code> B code> puis mappe code> peut convertir un essayer [A] code> à un essayer [B] code>. (Dans la langue des chats, ils sont Foncteurs mais les types de conteneurs dans la bibliothèque standard en général avoir mapper code> déjà.) p> li>
ol> SEQ code> < / a>, cette réponse est donc principalement en termes de liste code> à la place. p> Carte Code> sur ce conteneur pour fonctionner sur son contenu. Qui peut ressembler à: p>
supposant que le type d'entrée ait un tuple à l'intérieur de l'option code> code>, cela devrait vous donner le résultat souhaité:
val in: Seq[Try[Option[(String, Any)]]] = ??? val out: Try[Option[Map[String,Any]]] = Try(Some(in.flatMap(_.get).toMap))
Un moyen d'approcher ceci consiste à utiliser un vous démarrez avec FR vide carte. Vous utilisez ensuite A pour la compréhension pour parcourir la carte et l'élément actuels et enfin, vous ajoutez un nouveau tuple dans la carte si vous êtes présent. P> p> repliolft code>:
Je ne pense pas que
option [chaîne, tout] code> a du sens. Option prend un paramètre de type unique. Voulez-vous dire l'option[(chaîne, n'importe quel)] code>?Je ne reçois pas le point de
essayer [option [quelque chose]] code>. L'option est soitAucun code> ouCertains code> Signification des valeurs non valides ont été prises en charge au moment où elles atteignentEssayez code>. Cela semble un peu redondant.@Jrook Il y a un scénario que vous souhaitez garder une trace si une opération est réussie ou échoue, et même cette opération réussit, elle peut renvoyer un non plus.
@TexasBruce Si je contrôle la signature et obtenez
Aucun code> d'une opération, je sais déjà quelque chose de mauvais. Si je voulais connaître la raison pour laquelle cela s'est passé, je voudrais directementessayer code> l'opération. Le cas dans lequel une opération ne donne aucune erreur sans aucune erreur ne me semble douteuse. Pourquoi voudrais-je vouloir une logique pouvant produireAucun code> comme valeur normale? J'apprécierais si vous pouviez me montrer un cas d'utilisation du monde réel.@jrook Il existe de nombreux cas, tels que lorsque vous interrogez un enregistrement de DB. Vous utilisez Essayez d'indiquer s'il y a quelque chose qui ne va pas avec dB ou connexion. Ensuite, utilisez-les ou aucun pour indiquer si l'enregistrement existe.
@Texasbruce Je ne serrerais toujours pas les uns à l'autre et utilise plutôt tooption . Mais j'ai l'idée. Merci.