Scala,扩展迭代器

标签 scala iterator lazy-evaluation extend enrich-my-library

我希望扩展迭代器以创建一个新方法 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/

相关文章:

python - 迭代器的意外行为

c++ - 在 C++ 中将迭代器存储为类成员的最佳实践

jquery - 图像延迟加载(jQuery)后如何更改CSS?

python - 在 python 中,我可以使用 tee 延迟生成迭代器的副本吗?

Scala:如何获取数据框中的一系列行

Scala 不会与 java.lang.String 和 Case Class 模式匹配

class - Scala 类声明

c++ - 从满足谓词的迭代器中均匀随机地从容器中获取迭代器

Haskell 斐波那契解释

scala - 将 Spark DataFrame 保存到具有 map<string,string> 列类型的 csv 文件