2017-01-08 51 views
4

在Java中,我们通常可以在while条件下执行赋值。但是Kotlin抱怨。所以下面的代码不会编译:while表达式中不允许赋值?

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) 
} 

根据这个其他thread,这似乎是最好的解决办法:

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); 
} 

但是是什么呢?

回答

11

没有,最好的办法,国际海事组织,将

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

如果你想确保读者正确关闭(你会与一个try-与资源语句的Java),你可以使用

BufferedReader(reader).use { r -> 
    r.lineSequence().foreach { 
     println(it) 
    } 
} 
+0

真棒!用这个答案了解了很多!谢谢! – PedroD

+0

啊,我提出了一个编辑,我对“它”的语法糖一无所知。令人惊叹,仍在学习:D – PedroD

3

这里是最短的解决方案powered通过STDLIB也安全地关闭读者:

reader.forEachLine { 
    println(it) 
} 
3

这里是短科特林风格一般solution罗马Elizarov:

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