Si je veux réduire, par exemple, un Iterable[A]
pour tous les éléments d'un type particulier (par exemple String
) que je peux faire:Existe-t-il une méthode intégrée plus élégante pour filtrer et mapper une collection par type d'élément?
as filter { _.isInstanceOf[String] }
Cependant, il est évidemment souhaitable de utiliser cela comme une Iterable[String]
qui peut être fait via un map
:
as filter { _.isInstanceOf[String] } map { _.asInstanceOf[String] }
Ce qui est assez laid. Bien sûr, je pourrais utiliser flatMap
à la place:
as flatMap[String] { a =>
if (a.isInstanceOf[String])
Some(a.asInstanceOf[String])
else
None
}
Mais je ne suis pas sûr que ce soit plus lisible! J'ai écrit une fonction, narrow
, qui peut être utilisé par implicit
conversions:
as.narrow(classOf[String])
Mais je me demandais s'il y avait un mécanisme mieux intégré que j'ai oublié. D'autant plus que ce serait sympa de pouvoir réduire un List[A]
à un List[String]
, plutôt qu'à un Iterable[String]
comme ce sera le cas avec ma fonction.
Neat, est là nulle part ailleurs, vous pouvez utiliser la correspondance de motif qui est pas bien connu? – ryeguy
La correspondance de modèle s'applique aux instructions 'case' et aux affectations' var'/'var'. Les instructions 'Case' existent dans les instructions' match' et en tant que sucre syntaxique partiel, ce dernier étant ce qui est utilisé dans l'exemple. –
Il semble que 'partialMap' a été remplacé par' collect': http://www.scala-lang.org/old/node/5690.html –