好的,我想生成临时文件名。所以,我用var tempFileName
和fileNo
创建了一个类,它创建了像
BSirCN_0.txt
BSirCN_1.txt
BSirCN_2.txt
但是,为了做到这一点,我必须保持计数和我的方式是调用类的next()
函数,它按顺序返回文件名(在上面的情况下应该返回BSirCN_4
。现在这与FP有关,因为我正在修改状态对象中的名称计数。如何以功能的方式进行。我能想到的一种方法是保持计数函数被调用的地方并且只是连接。还有其他方法吗?
只需返回一个新对象:
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
您可以使用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
与@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