可穿越的懒惰过滤器

时间:2014-01-07 23:47:13

标签: scala

我最近对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,但似乎没有帮助)

0 个答案:

没有答案