Je viens donc de commencer à utiliser Kotlin pour Android et de convertir mes codes Java Android en Kotlin.
Dans l'une des conversions, je suis tombé sur un BufferedReader, que j'écrirais habituellement en Java comme suit:
String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
result += line;
}
Mais à Kotlin, il semble que Kotlin ne me permette pas d’attribuer des valeurs à des variables en conditions while.
Actuellement, j'ai écrit le code comme suit:
val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
line = reader.readLine()
result += line
}
que je ne trouve pas si élégant et qui me semble pré-générique, malgré l’utilisation de Kotlin.
Quelle serait la meilleure façon d'utiliser BufferedReader à Kotlin?
Vous pouvez utiliser bufferedReader
like so
val allText = inputStream.bufferedReader().use(BufferedReader::readText)
Si vous voulez toujours le lire ligne par ligne, vous pouvez utiliser certaines fonctions d'extension de std lib et le faire comme suit:
val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
val line = iterator.next()
// do something with line...
}
reader.close()
ou alternativement, en utilisant une approche "fonctionnelle":
val reader = someStream.bufferedReader()
reader.useLines {
it.map { line -> // do something with line }
}
en utilisant useLines, vous n'avez pas besoin d'appeler explicitement close sur le lecteur, la fonction d'extensions useLines le fera pour vous!
Il suffit d’ajouter celles-ci à titre de référence.
Une autre façon consiste à utiliser une boucle for:
val reader = BufferedReader(someStream)
for (line in reader.lines()) {
println(line)
}
Bien qu’elle ne soit pas aussi concise que la réponse acceptée, elle vous permettra de parcourir en boucle et d’exécuter une sorte de logique sans tout empiler en une seule chaîne, comme indiqué ci-dessous
val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
utiliser le code comme ça
val input = conn.inputStream val allText = input.bufferedReader (). use (BufferedReader :: readText) val result = StringBuilder () result.append (allText) renvoie result.toString () } autre { renvoyer "échec" }