varias superponer studio lineas graficos graficas data scala

superponer - Filtrar una lista de Scala por tipo



superponer graficas en r (3)

Tengo una estructura de clases como esta

abstract class A class B extends A class C extends A class D extends A class E extends A

y tengo una colección de las diversas instancias, por ejemplo:

val xs = List(new D, new B, new E, new E, new C, new B)

Mi pregunta es, ¿existe una forma elegante de filtrar algunas de las subclases de la lista?

Digamos que quiero todas las instancias excepto B''s y C''s. Puedo hacerlo con un montón de isInstanceOf, o usando collect como este:

val ys = (xs collect { case b: B => None case c: C => None case notBorC => notBorC }).filter(_ != None).asInstanceOf[List[A]]

Esto funciona pero se siente incómodo, principalmente debido al filtro y al lanzamiento. ¿Hay una manera más elegante? Se prefiere menos código, y me gustaría tener una solución que no necesite actualizarse si agrego más subclases de A.


La formulación de problemas como preguntas parece ser una buena forma de resolverlos :) Mi pregunta realmente proporciona la respuesta; solo filtre por subtipo:

val ys = xs filterNot(List(classOf[B], classOf[C]) contains _.getClass)


collect se puede utilizar para filtrar valores en los que se define la función:

Obtenga todos los valores de tipo A:

xs.collect { case a: A => a }

Obtenga todos los valores excepto B y C:

xs diff xs.collect { case x@(_: B | _: C) => x }


flatMap esa mierda! ( como dicen ):

scala> val ys = xs flatMap { | case _: B | _: C => None | case other => Some(other) | } ys: List[A] = List(D@7ecdc97b, E@2ce07e6b, E@468bb9d1)

En su caso, estaba obteniendo una List[ScalaObject] porque ScalaObject es el límite inferior mínimo de None , D y E