我最近对Traversable
的{{1}}方法的实施感到惊讶。我期待过滤器是懒惰的,但它似乎创建了一个新的物理集合。
当像
一样使用遍历时,这会导致问题filter
如果在运行中计算遍历,则会进行不必要的计算,因为我只需要计算生成的满足条件的前10个元素。当前的实现似乎评估了整个计算。为了解决这个问题,我使用lazyFilter方法创建了一个隐式类:
trav.filter(/*...*/).take(10)
现在回答问题:
implicit class TravLazyFilter[T](underlying: Traversable[T]) {
def lazyFilter(cond: T => Boolean) = new Traversable[T] {
def foreach[U](func: T => U) = {
underlying.foreach { x =>
if (cond(x))
func(x)
else {}
}
}
}
}
Traversable
方法的假设是否正确?filter
?Traversable
方法是否正确?lazyFilter
所做的事情? (我尝试了lazyFilter
,但似乎没有帮助)