При написании кода Scala я регулярно сталкиваюсь со случаями, когда у меня есть «процессорные» функции, которые итеративно работают с набором элементов, а также должны знать длину коллекции.
С другой стороны, у меня есть функции «провайдера», которые генерируют коллекции и поэтому уже знают длину.Сгенерированные коллекции могут быть List[T]
, Array[T]
или Set[T]
и т. Д., Но даже в случае List[T]
мой генератор знает размер (даже если тип List
не сохраняет его).
Таким образом, я бы естественным образом объявил, что функции «процессора» принимают в качестве параметра наиболее общий тип, который, по-видимому, подходит для всех типов коллекций, Iterable[T]
.Тем не менее, им затем нужно внутренне определить размер с помощью итеративного обхода коллекции за счет O (N), что нежелательно.
Таким образом, мое наивное решение состояло бы в том, чтобы создать новый тип, такой как IterableWithSize[T]
, и заставить функции провайдера и процессора создавать и принимать этот тип.Ни Seq[T]
, ни IndexedSeq[T]
, кажется, не отвечают всем требованиям.Но это похоже на довольно распространенный вариант использования, поэтому я подозреваю, что есть более идиоматический способ сделать это.Что бы это было?