(Gen)TraversableOnce.toIteratorTraversableLike中被覆盖为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/

10-12 22:15