Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 390
PedroD Avatar asked Jan 08 '17 20:01

PedroD


2 Answers

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)
    }
}
like image 173
JB Nizet Avatar answered Oct 07 '22 09:10

JB Nizet


And here is a short Kotlin-style general solution by Roman Elizarov:

while (true) {
    val line = reader.readLine() ?: break
    println(line);
}

Here break has Nothing type that also helps to promote type inference for the line as non-nullable string.

like image 22
Vadzim Avatar answered Oct 07 '22 09:10

Vadzim