Другие забавные вариации так что вы можете увидеть силу Котлин:
Быстрая версия, создавая строку, чтобы написать все сразу:
File("somefile.txt").writeText(history.entries.joinToString("\n") { "${it.key}, ${it.value}" })
// or just use the toString() method without transform:
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)
}
Я добавил больше вариантов нового ответа для удовольствия, чтобы дать вам больше идей о том, что вы можете сделать. –