如何在不使用可变变量的情况下在Scala中编程迭代器?

赫克托·巴比耶里(Hector Barbieri)

我想以功能方式实现迭代器特征,即不使用var。怎么做?

假设我有一个外部库,可以通过调用一个函数来获取一些元素,getNextElements(numOfElements: Int):Array[String]并且我想使用该函数实现一个Iterator,但不使用表示“当前”数组的变量(在我的情况下为var缓冲区)。我该如何以功能方式实现它?

class MyIterator[T](fillBuffer: Int => Array[T]) extends Iterator[T] {
    var buffer: List[T] = fillBuffer(10).toList

    override def hasNext(): Boolean = {
        if (buffer.isEmpty) buffer = fillBuffer(10).toList
        buffer.nonEmpty
    }

    override def next(): T = {
        if (!hasNext()) throw new NoSuchElementException()

        val elem: T = buffer.head
        buffer = buffer.tail
        elem
    }
}

class Main extends App {
    def getNextElements(num: Int): Array[String] = ???

    val iterator = new MyIterator[String](getNextElements)

    iterator.foreach(println)
}
卡尔·比勒费尔特

迭代器是可变的,至少在没有返回状态变量的接口的情况下是可变的,因此,一般来说,如果不进行某种形式的更改,就无法直接实现接口。

就是说,Iterator伴随对象中有一些非常有用的功能,这些功能可让您隐藏变异并简化实现。我会像这样实现您的:

Iterator.continually(getNextElements(10)).flatten

getNextElements(10)每当需要填充缓冲区时就会调用此方法flatten其从更改Iterator[Array[A]]Iterator[A]

注意,这将返回一个无限迭代器。您的问题没有说明检测源元素的结尾,但是我通常使用来实现takeWhile例如,如果getNextElements在没有更多元素的情况下返回空数组,则可以执行以下操作:

 Iterator.continually(getNextElements(10)).takeWhile(!_.isEmpty).flatten

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用表单taglib的情况下在JSP中访问Spring 3 MVC验证器结果

如何在不使用迭代器的情况下在Golang中循环?

如何在不使用segue的情况下在视图控制器之间传递图像

我如何在不使用HttpContext静态类的情况下在ApiController中获取HttpRequest对象?

如何在不使用`osascript`的情况下在Python中获取macOS启动驱动器的名称?

如何在不使用包装器的情况下在React中渲染字符串数组?

如何在不使用python中的find()的情况下在字符串中查找索引

如何在不使用几何类型的情况下在MySQL中获得更高的计算距离精度?

如何在不使用Js id选择器的情况下在Angular中动态获取* ngFor中的元素

如何在不使用全局变量的情况下在函数内使用PHP类方法?

Kotlin:如何在不使用getter和setter的情况下在ViewModel中更改MutableLiveData的值

如何在不使用标志变量或函数的情况下在C ++中查找素数?

如何在不使用宏的情况下在MS Word中查找文档变量

如何在不使用图形登录提示的情况下在Fedora 20中设置窗口管理器?

如何在不使用线程的情况下在Java中使用计时器?

如何在不使用Java中的全局变量的情况下在两个类之间共享变量?

如何在不使用xterm的情况下在TWM窗口管理器上打开应用

如何在不使用鼠标的情况下在设备管理器中打开项目?

如何在不使用迭代器的情况下在c ++中打印地图

在不使用Angular 2中的@Input装饰器的情况下在组件之间传递变量

如何在没有迭代器的情况下在 Ruby 中收集块值?

如何在不使用 distinct 方法的情况下在 Django 中获取不同的过滤查询集?

如何在不使用 Recyclerview 中的 getAdapterPosition 的情况下在 ViewHolder 中获得正确的项目位置?

如何在不使用count(*)的情况下在greenplum中查找表中的行数

如何在不使用查询参数或全局变量的情况下在 express 中的路由之间传递值?

如何在不使用遥控器的情况下在 Electron 渲染过程中打开 dialog.showSaveDialog ?

如何在没有可变性的情况下在 Scala 中实现 memoization?

如何在不使用 venv 的情况下在 Gitlab CI/CD 中缓存 python 依赖项?

如何在不使用 webhook 的情况下在服务器端确认条带支付?