2010-02-07 6 views
20

Supposons que vous avez une liste (1, "1"), elle est tapée Liste [Tout], ce qui est bien sûr correct et attendu. Maintenant, si je mappe la liste comme ceciType de collection Scala pour le filtre

scala> List(1, "1") map { 
    | case x: Int => x 
    | case y: String => y.toInt 
    | } 

le type résultant est List [Int] qui est également attendu. Ma question est de savoir s'il y a un équivalent pour mapper le filtre car l'exemple suivant donnera une liste [Any]. Est-ce possible? Je suppose que cela pourrait être résolu à la compilation et peut-être pas à l'exécution?

scala> List(1, "1") filter { 
    | case x: Int => true 
    | case _ => false 
    | } 

Répondre

24

Scala 2.9:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 
1

En ce qui concerne votre question modifiée, si vous utilisez simplement un garde dans le cas comprenant votre fonction partielle, vous obtenez le filtrage:

scala> val l1 = List(1, 2, "three", 4, 5, true, 6) 
l1: List[Any] = List(1, 2, three, 4, 5, true, 6) 

scala> l1.partialMap { case i: Int if i % 2 == 0 => i } 
res0: List[Int] = List(2, 4, 6) 
+0

Pourquoi est-ce seulement possible avec un garde? –

+0

Désolé, c'était un commentaire vraiment stupide. Mais pourquoi filter() ne génère pas de résultat comme partialMap? –

+1

@Joa 'filter' ne change pas le type d'une collection, car elle ne modifie pas ses éléments. –

6

Pour toute personne trébuchant sur cette question se demandant pourquoi la réponse la plus votée ne fonctionne pas pour eux, sachez que la méthode partialMap a été renommée collect avant la finale de Scala 2.8 Libération. Essayez ceci:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 

(. Cela devrait être un commentaire sur la réponse autrement-merveilleux de Daniel C. Sobral, mais en tant que nouvel utilisateur, je ne suis pas autorisé à commenter encore)

Questions connexes