Избегание приведения типов в for-comprehension для последовательности смешанных элементов

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

  •  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].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top