Я пытаюсь сделать Set
-like, который принимает только одну запись для каждого подтипа trait
. Мой код в настоящее время:Scala Map, индексированный по типу
import scala.reflect.ClassTag
trait Component
case class Entity(id: Int)
case class ComponentA(some: String) extends Component
case class ComponentB(other: Int) extends Component
case class ComponentC(thing: Boolean) extends Component
val components: Map[Entity, Set[Component]] = Map(Entity(1) -> Set(ComponentA("A"), ComponentB(1)))
def getComponent[A <: Component: ClassTag](entity: Entity): Option[A] = {
components.getOrElse(entity, Nil).collectFirst { case c: A => c }
}
getComponent[ComponentA](Entity(1))
getComponent[ComponentB](Entity(1))
getComponent[ComponentC](Entity(1))
Мой список лиц будет в миллионы, но компоненты для каждого объекта будет ~ 100. Есть ли более быстрый способ с индексированной картой какого-либо типа, чтобы предотвратить O (n)collectFirst
при каждом чтении и filter
+ append
для каждого обновления?
Я попробовал несколько вещей, но ближе всего я мог бы получить, это создать ComponentType
признак, используемый для ключа Map[ComponentType, Component]
, а затем метод getComponent
возвращает родовое Component
вместо фактического требуемого типа. Это оставляет меня набирать cast во время выполнения или совпадение шаблонов для каждого вызывающего, вместо того, чтобы компилятор его использовал для меня.
Любые другие комбинации с типами, перечислениями, возможно специализированными Set
или Map
типами, которые могут здесь помочь?
Возможно, вся проверка типов не стоит накладных расходов на выполнение только 100/2 итераций в среднем, но мне нечего сравнивать производительность.
Я бы не возиться с оптимизацией производительности, прежде чем определить, что существует реальная проблема производительности , –
Это абсолютно верно. Моя текущая реализация выполняется медленнее, чем хотелось бы, но я еще не определил, что это еще одна причина. Но мне кажется, что это разочаровывает то, что я не могу получить эту же самую подпись метода для работы с другим базовым типом коллекции. Поэтому я все еще пытаюсь выяснить _why_ :) –