Altre variazioni divertenti in modo da poter vedere la potenza di Kotlin:
Una versione rapida con la creazione della stringa di scrivere tutto in una volta:
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"))
oppure si supponendo che potrebbe fare altre cose funzionali come le linee di filtro o prendere solo il primo 100, ecc.Si potrebbe seguire questa strada:
File("somefile.txt").printWriter().use { out ->
history.map { "${it.key}, ${it.value}" }
.filter { ... }
.take(100)
.forEach { out.println(it) }
}
o dato un Iterable
, consentire la scrittura in un file utilizzando una trasformazione in una stringa, con la creazione di funzioni di estensione (simile a writeText()
versione precedente, ma i flussi il contenuto, invece di materializzando una grande stringa prima):
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)
}
usato come uno di questi:
history.entries.toFile(File("somefile.txt")) { "${it.key}, ${it.value}" }
history.entries.toFile("somefile.txt") { "${it.key}, ${it.value}" }
o toString uso predefinito() su ogni articolo:
history.entries.toFile(File("somefile.txt"))
history.entries.toFile("somefile.txt")
Oppure dato un File
, permettono il riempimento da un Iterable
, creando la funzione di estensione:
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() }
}
}
con l'uso di:
File("somefile.txt").fillWith(history.entries) { "${it.key}, ${it.value}" }
o l'uso toString di default() su ogni elemento:
File("somefile.txt").fillWith(history.entries)
che se si ha già l'altro toFile
estensione, si potrebbe riscrivere dover chiamare un interno all'altro:
fun <T: Any> File.fillWith(things: Iterable<T>, transform: (T)->String = {it.toString()}) {
things.toFile(this, transform)
}
Ho aggiunto più varianti in una nuova risposta per divertimento, per darti più idee su ciò che puoi fare. –