在Scala中生成文件名的功能方法

KAY*_*YAK 4 random functional-programming scala

好的,我想生成临时文件名。所以,我创建了一个类变种tempFileName,并fileNo使得它创建类似文件

BSirCN_0.txt
BSirCN_1.txt
BSirCN_2.txt
Run Code Online (Sandbox Code Playgroud)

但是,要做到这一点,我必须保持计数,并且要按照这种方式来调用next()类的函数,该函数按顺序返回文件名(BSirCN_4在上述情况下应该返回。现在,这与FP背道而驰,因为我正在修改状态,即对象中名称的计数。我该如何以一种功能的方式来实现。我能想到的一种方法是保持对调用函数并连接处的计数。还有其他方法吗?

Jea*_*art 6

只需返回一个新对象:

case class FileGenerator(tempFileName: String, fileNo: Long = 0) {
  lazy val currentFileName = tempFileName + "_" + fileNo
  lazy val next = FileGenerator(tempFileName, fileNo + 1)
}

Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

val generator = FileGenerator("BSirCN")

val first = generator.currentFileName
val next = generator.next.currentFileName
Run Code Online (Sandbox Code Playgroud)


Lui*_*rez 5

您可以使用Iterator (或任何其他类型的无限和惰性集合)来避免突变。

final class TempFileNamesGenerator(prefix: String) {
  private[this] val generator =
    Iterator
      .from(start = 0)
      .map(i => s"${prefix}_${i}.txt")

  def next(): String =
    generator.next()
}

val generator = new TempFileNamesGenerator(prefix = "BSirCN")

generator.next() // BSirCN_0.txt
generator.next() // BSirCN_1.txt
generator.next() // BSirCN_2.txt
Run Code Online (Sandbox Code Playgroud)