Избегание приведения типов в for-comprehension для последовательности смешанных элементов
-
20-12-2019 - |
Вопрос
Я знаю, что типизация имеет большое значение в Scala, и в идеале вы можете обойти приведение типов или любые другие запутанные решения, используя такие вещи, как сопоставление с образцом.Однако я не могу понять, как я могу это сделать, если я перебираю список или последовательность элементов, которые являются подтипом общего супертипа, и просто хочу, чтобы элементы определенного подтипа были включены в последовательность этого подтипа.Я не думаю, что смогу поместить совпадение с образцом в for-comprehension
для достижения этой цели.
Допустим, например, у меня есть эти классы:
sealed abstract class SuperType
case class SubtypeA extends SuperType
case class SubtypeB extends SuperType
у меня есть Seq[SuperType]
и я хочу получить Seq
только SubtypeA
случаи, поэтому Seq[SubTypeA]
, чтобы затем я мог пройти через него и выполнить метод, предоставленный SubTypeA
для всех элементов.
Решение
В Скале есть функция под названием collect
это делает именно то, что вам нужно.Он принимает частичную функцию в качестве параметра, и если частичная функция определена в элементе, он применяет ее.Если это не так, то он пропускает его.Поскольку сопоставление по сути является частичной функцией, мы можем использовать это в своих интересах:
val list: Seq[SuperType] = ???
val listOfAtypes = list.collect({ case a: SubtypeA => a })
{ case a: SubtypeA => a }
является PartialFunction[SuperType, SubtypeA].