给定一个来自遗留库的类,其行为类似于Iterator
,因此您可以使用hasNext
和next
遍历其内容,但它不实现Iterator
接口:
class LegacyIterator[T](iterable: Iterable[T]) {
val iterator: Iterator[T] = iterable.iterator
def hasNext: Boolean = iterator.hasNext
def next(): T = iterator.next()
}
val lagIter: LegacyIterator[Int] = new LegacyIterator(List(1, 2, 3))
对于遍历这样一个数据结构的最佳方式--尤其是在函数的作用域内--你有什么看法?我提出了两个版本:
一个使用@tailrec
@tailrec
def lagIterList(accu: List[Int]): List[Int] =
if (lagIter.hasNext) lagIterList(lagIter.next() :: accu) else accu
val res = lagIterList(Nil).reverse
一个使用LazyList
def ll: LazyList[Int] = if(lagIter.hasNext) lagIter.next() #:: ll else LazyList.empty
val res = ll.toList
您认为哪种版本更符合Scala的习惯用法?tailrec
版本在处理较大的数据结构时可能会稍微快一些,但LazyList
版本更好地利用了集合库。
或者其他的想法?
3条答案
按热度按时间xtfmy6hx1#
我会考虑使用一个隐式 Package 器类来扩展Iterator[T]:
cwxwcias2#
把它转换成一个普通的迭代器:
然后你可以使用任何常规的scala工具来遍历/转换它,例如:
val list = normalIterator.toList
rsaldnfx3#
好吧,这取决于您所指的 “遍历它”。如果您的意思只是从它创建一个
List
,我将直接使用unfold