8 votes

Comment exprimer chaque élément dans une liste Scala ?

J'ai une API (de la bibliothèque java d'un tiers) qui ressemble à ceci :

public List<?> getByXPath(String xpathExpr)

défini sur une classe appelée DomNode

Je veux faire quelque chose comme obtenir une liste Scala dans laquelle chaque élément est du type spécifié :

val txtNodes: List[DomText] = node.getByXPath(xpath).toList

Mais le compilateur donne une erreur : type mismatch.

quelle est la solution à ce problème ?

15voto

Didier Dupont Points 18256

Vous devez effectuer un casting pour chaque élément de la liste, afin de prouver qu'ils ont tous le type requis. Vous pouvez le faire juste en itérant, par exemple

node.getByXPath(xpath).map{case d: DomText => d}.toList

ou

node.getByXPath(xpath).map(_.asInstanceOf[DomText]).toList

quelle écriture de la distribution vous convient le mieux.

Vous pouvez aussi lancer la liste, node.getByXPath(xPath).toList.asInstanceOf[List[DomText]] mais vous obtiendrez un avertissement, car ce transfert est effectué sans aucune vérification en raison de l'effacement des types (comme en Java).

11voto

Alois Cochard Points 4846

Depuis Scala 2.8, vous pouvez utiliser 'collect' :

scala> "hi" :: 1 :: "world" :: 4 :: Nil collect {case s:String => s}
res13: List[String] = List(hi, world)

Source : http://daily-scala.blogspot.com/2010/04/filter-with-flatmap-or-collect.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X