gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:09:02 25 4
gpt4 key购买 nike

我想以功能方式实现迭代器特性,即不使用 var。如何做到这一点?

假设我有一个外部库,我通过调用函数 getNextElements(numOfElements: Int):Array[String] 获取一些元素,我想使用该函数实现一个迭代器,但不使用指示“当前”数组的变量(在我的例子中是 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)
}

最佳答案

迭代器是可变的,至少在没有同时返回状态变量的接口(interface)的情况下是这样,因此您通常无法在不进行某种变更的情况下直接实现接口(interface)。

也就是说,Iterator 伴生对象中有一些非常有用的函数,可以让您隐藏突变,并使实现更简洁。我会像这样实现你的:

Iterator.continually(getNextElements(10)).flatten

这会在需要填充缓冲区时调用 getNextElements(10)flatten 将其从 Iterator[Array[A]] 更改为 Iterator[A]

注意这会返回一个无限迭代器。你的问题没有提到任何关于检测源元素结束的问题,但我通常会使用 takeWhile 来实现它。例如,如果 getNextElements 在没有更多元素时返回一个空数组,您可以这样做:

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

关于scala - 如何在不使用可变变量的情况下在 Scala 中编写迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57094410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com