(Gen
)TraversableOnce.toIterator
在TraversableLike
中被覆盖为toStream.iterator
,从而引起中间流。
举一个简单的例子,我正在尝试实现一个简单的izip
实用程序,该实用程序在调用zip
之前始终将其参数强制转换为迭代器,以便在两个集合上产生有效的迭代器。
以下是无效的(由于中间流):
def izip[A,B](xs: TraversableOnce[A], ys: TraversableOnce[B]) =
xs.toIterator zip ys.toIterator
并且必须扩展为:
def izip[A,B](xs: Iterable[A], ys: Iterable[B]) =
xs.iterator zip ys.iterator
def izip[A,B](xs: Iterator[A], ys: Iterable[B]) =
xs zip ys.iterator
def izip[A,B](xs: Iterable[A], ys: Iterator[B]) =
xs.iterator zip ys
def izip[A,B](xs: Iterator[A], ys: Iterator[B]) =
xs zip ys
// .. and more needed to handle Traversables as well
有没有更好的办法?
最佳答案
我认为特征只能保证给定方法的存在,而不能保证其实现。它们可以提供默认的实现,但是子类型可以覆盖它。
因此,即使TraversableLike提供了toIterator
的实现,也会使用您传递的对象的实际实现。
如果您在标准集合中遇到性能问题,那么真正的问题可能在其他地方。如果是自定义集合,则应使用明智的定义覆盖toIterator
。
关于scala - 在Scala中,如何解决TraversableLike.toIterator效率低下的中间流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6691036/