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