kotlinkotlin-interop

Assignment not allowed in while expression?


In Java we can usually perform an assignment within the while condition. However Kotlin complains about it. So the following code does not compile:

val br = BufferedReader(InputStreamReader(
        conn.inputStream))

var output: String
println("Output from Server .... \n")
while ((output = br.readLine()) != null) { // <--- error here: Assignments are not expressions, and only expressions are allowed in this context
    println(output)
}

According to this other thread, this seems the best solution:

val reader = BufferedReader(reader)
var line: String? = null;
while ({ line = reader.readLine(); line }() != null) { // <--- The IDE asks me to replace this line for while(true), what the...?
  System.out.println(line);
}

But is it?


Solution

  • No, the best way, IMO, would be

    val reader = BufferedReader(reader)
    reader.lineSequence().forEach {
        println(it)
    }
    

    And if you want to make sure the reader is properly closed (as you would with a try-with-resources statement in Java), you can use

    BufferedReader(reader).use { r ->
        r.lineSequence().forEach {
            println(it)
        }
    }