我希望扩展迭代器以创建一个新方法 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)
关于Scala,扩展迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329876/