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

问题描述 投票:3回答:3

好的,我想生成临时文件名。所以,我用var tempFileNamefileNo创建了一个类,它创建了像

BSirCN_0.txt
BSirCN_1.txt
BSirCN_2.txt

但是,为了做到这一点,我必须保持计数和我的方式是调用类的next()函数,它按顺序返回文件名(在上面的情况下应该返回BSirCN_4。现在这与FP有关,因为我正在修改状态对象中的名称计数。如何以功能的方式进行。我能想到的一种方法是保持计数函数被调用的地方并且只是连接。还有其他方法吗?

scala random functional-programming
3个回答
6
投票

只需返回一个新对象:

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

然后你可以这样做:

val generator = FileGenerator("BSirCN")

val first = generator.currentFileName
val next = generator.next.currentFileName

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

4
投票

与@Luis提出但使用流的方法类似的解决方案:

def namesStream(prefix: String, suffix: String): Stream[String] = Stream.from(0).map(n => s"$prefix$n$suffix")

然后像这样使用它:

val stream = namesStream("BSirCN_", ".txt")
stream.take(5) // BSirCN_1.txt, BSirCN_2.txt, BSirCN_3.txt, BSirCN_4.txt, BSirCN_5.txt
// or
stream.drop(10).take(2) // BSirCN_11.txt, BSirCN_12.txt
© www.soinside.com 2019 - 2024. All rights reserved.