En évitant la conversion de type dans une compréhension d'une séquence d'objets mélangés

StackOverflow https://stackoverflow.com//questions/20004359

  •  20-12-2019
  •  | 
  •  

Question

Je sais que le typage est une grosse affaire en Scala, et, idéalement, vous allez autour de la conversion de type ou de désordre solutions en utilisant des choses comme le Pattern Matching.Cependant, je ne peux pas comprendre comment pourrais-je aller à ce sujet si je suis itérer sur une liste ou une séquence d'éléments qui sont un sous-type commun de la super type, et vous voulez juste ceux d'un sous-type spécifique d'une Séquence de sous-type.Je ne pense pas que je peux mettre un motif dans un match for-comprehension pour atteindre cet objectif.

Donc disons que par exemple, j'ai ces classes:

sealed abstract class SuperType
case class SubtypeA extends SuperType
case class SubtypeB extends SuperType

J'ai un Seq[SuperType] et je veux obtenir un Seq de juste la SubtypeA instances, un Seq[SubTypeA], de sorte que je peux faire une boucle par elle et exécuter une méthode fournie par SubTypeA pour tous les éléments.

Était-ce utile?

La solution

Scala a un fonction appelée collect qui fait exactement ce dont vous avez besoin.Il faut Partielle de la Fonction en tant que paramètre et si la Fonction Partielle est définie à l'élément, puis il l'applique.Si ce n'est pas le cas, alors il l'ignore.Depuis l'appariement est essentiellement une Fonction Partielle, nous pouvons utiliser à notre avantage:

val list: Seq[SuperType] = ???
val listOfAtypes = list.collect({ case a: SubtypeA => a })

{ case a: SubtypeA => a } est un PartialFunction[SuperType, SubtypeA].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top