在 Kotlin 的 while 循环中包括赋值和对赋值的测试

J.E*_*zyk 1 idioms kotlin

我希望使用 Java 中经常使用的相当标准的 while 循环习惯用法来查找文本文件的最后一行。

我有一个不太紧凑的版本可以工作。但我想使用的语法在 Kotlin 中似乎不是有效的语法。我的首选方法包括在同一行中进行作业和Boolean对该作业的测试。

诚然,这是一个小问题,但我希望更好地实现我的 Kotlin 代码。

fun readLastLine(file:File):String {
    val bufferedReader = file.bufferedReader()
    var lastLine=""

    //valid
    var current = bufferedReader.readLine()
    while(current != null) {
        lastLine=current
        current = bufferedReader.readLine()
    }
    //return lastLine

    //not valid...
    //while((current=bufferedReader.readLine())!=null){
    //    lastLine=current
    //}

   //responding to comment below, 
   //preferred/terse answer using file.readLines
   //this reads all the lines into a list, then returns the last
   return file.readLines().last()
}
Run Code Online (Sandbox Code Playgroud)

Nae*_*mul 5

在 Kotlin 中,赋值并不是一个值等于指定值的表达式。

您可以使用runKotlin 中的函数组合两个语句。该函数返回最后一个表达式的值。

var current = ""
while (run {
    current = bufferedReader.readLine()
    current != null
}) { // or while (run { current = bufferedReader.readLine(); current != null }) {
    lastLine = current
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以进一步减少 Kotlin 中使用的代码File.forEachLine()

fun readLastLine(file: File): String {
    var lastLine = ""
    file.forEachLine { line ->
        lastLine = line
    }
    return lastLine
}
Run Code Online (Sandbox Code Playgroud)

或者更短,

fun readLastLine(file: File): String {
    var lastLine = ""
    file.forEachLine { lastLine = it }
    return lastLine
}
Run Code Online (Sandbox Code Playgroud)

BufferedReader在内部使用并自动关闭:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/for-each-line.html