编写 Scala 代码时,我经常遇到这样的情况:我有“处理器”函数,这些函数对元素集合进行迭代操作,并且还需要知道集合的长度。
另一方面,我有生成集合的“提供者”函数,因此已经知道长度。生成的集合可能是List[T]
、Array[T]
或Set[T]
等,但即使在 的情况下List[T]
,我的生成器也知道大小(即使List
类型不存储它)。
因此,我很自然地将“处理器”函数声明为采用似乎适合所有集合类型的最通用类型Iterable[T]
,作为参数。然而,他们在内部需要以 O(N) 为代价通过迭代集合遍历来找出大小,这是不可取的。
所以我天真的解决方案是创建一个新类型IterableWithSize[T]
,让提供者和处理器函数创建并采用这种类型。Seq[T]
两者IndexedSeq[T]
似乎都不符合要求。但这似乎是一个相对常见的用例,所以我怀疑有一种更惯用的方法来做到这一点。那会是什么?