2010-02-07 15 views
20

Supongamos que tiene una Lista (1, "1") que está tipeada Lista [Cualquiera], que es por supuesto correcta y esperada. Ahora si mapeo la lista como estaTipo de colección de Scala para filtro

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

el tipo resultante es la Lista [Int] que se espera también. Mi pregunta es si existe un mapa equivalente para filtro porque el siguiente ejemplo dará como resultado una lista [Cualquiera]. es posible? Supongo que esto podría resolverse en tiempo de compilación y posiblemente no en tiempo de ejecución.

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

Respuesta

24

Scala 2.9:

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

Con respecto a su pregunta modificado, si usted sólo tiene que utilizar un protector en el caso que comprende su función parcial, se obtiene el filtrado:

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

¿Por qué es esto solo posible con un guardia? –

+0

Disculpa, fue un comentario realmente estúpido. Pero ¿por qué filter() no genera un resultado como partialMap? –

+1

@Joa 'filter' no cambia el tipo de una colección, porque no modifica sus elementos. –

6

Para cualquier persona tropezando con esta pregunta preguntándose por qué la respuesta más votada no funciona para ellos, tenga en cuenta que el método partialMap pasó a llamarse collect antes del final de Scala 2.8 lanzamiento. Tal vez puedas probar:

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

(. Esto debería ser un comentario en respuesta de lo contrario-maravilloso de Daniel C. Sobral, sino como un nuevo usuario, no se me permite hacer comentarios aún)

Cuestiones relacionadas