其他有趣的变化,让你看到 Kotlin 的强大:
通过一次性创建要写入的字符串来快速生成版本:
File("somefile.txt").writeText(history.entries.joinToString("\n") { "${it.key}, ${it.value}" })
File("somefile.txt").writeText(x.entries.joinToString("\n"))
假设你可能会执行其他功能,如筛选行或仅获取前100行等。您可以选择以下路线:
File("somefile.txt").printWriter().use { out ->
history.map { "${it.key}, ${it.value}" }
.filter { ... }
.take(100)
.forEach { out.println(it) }
}
或者,针对Iterable
,通过创建扩展函数(类似于上面介绍的writeText()
版本,但是将内容作为流而不是首先生成一个大字符串)允许将其转换为字符串并写入文件:
fun <T: Any> Iterable<T>.toFile(output: File, transform: (T)->String = {it.toString()}) {
output.bufferedWriter().use { out ->
this.map(transform).forEach { out.write(it); out.newLine() }
}
}
fun <T: Any> Iterable<T>.toFile(outputFilename: String, transform: (T)->String = {it.toString()}) {
this.toFile(File(outputFilename), transform)
}
可以用作以下任何一种:
history.entries.toFile(File("somefile.txt")) { "${it.key}, ${it.value}" }
history.entries.toFile("somefile.txt") { "${it.key}, ${it.value}" }
或者对每个项目使用默认的toString()方法:
history.entries.toFile(File("somefile.txt"))
history.entries.toFile("somefile.txt")
如果给定一个File
,可以通过创建以下扩展函数从Iterable
中填充它:
fun <T: Any> File.fillWith(things: Iterable<T>, transform: (T)->String = {it.toString()}) {
this.bufferedWriter().use { out ->
things.map(transform).forEach { out.write(it); out.newLine() }
}
}
使用:
File("somefile.txt").fillWith(history.entries) { "${it.key}, ${it.value}" }
或对每个项使用默认的toString()方法:
File("somefile.txt").fillWith(history.entries)
如果您已经有了另一个toFile
扩展,您可以重写代码,让其中一个扩展调用另一个扩展:
fun <T: Any> File.fillWith(things: Iterable<T>, transform: (T)->String = {it.toString()}) {
things.toFile(this, transform)
}