我希望扩展迭代器以创建一个新方法takeWhileInclusive
,该方法将像takeWhile
一样运行,但包含最后一个元素。
我的问题是什么是扩展迭代器以返回我希望对其进行延迟评估的新迭代器的最佳实践。来自C#背景,我通常使用IEnumerable
并使用yield
关键字,但是这样的选项在Scala中似乎不存在。
例如我本来可以
List(0,1,2,3,4,5,6,7).iterator.map(complex time consuming algorithm).takeWhileInclusive(_ < 6)
因此,在这种情况下,
takeWhileInclusive
将只对值解析谓词,直到获得大于6的结果为止,并且它将包括该第一个结果到目前为止,我有:
object ImplicitIterator {
implicit def extendIterator(i : Iterator[Any]) = new IteratorExtension(i)
}
class IteratorExtension[T <: Any](i : Iterator[T]) {
def takeWhileInclusive(predicate:(T) => Boolean) = ?
}
最佳答案
这是我发现可变解决方案更好的一种情况:
class InclusiveIterator[A](ia: Iterator[A]) {
def takeWhileInclusive(p: A => Boolean) = {
var done = false
val p2 = (a: A) => !done && { if (!p(a)) done=true; true }
ia.takeWhile(p2)
}
}
implicit def iterator_can_include[A](ia: Iterator[A]) = new InclusiveIterator(ia)