Включите как назначение, так и проверку назначенного значения в цикле while для Kotlin

Я пытаюсь найти последнюю строку текстового файла, используя довольно стандартную идиому цикла while, которую часто нахожу в Java.

У меня работает менее компактная версия. Но тот, который я хотел бы использовать, не является допустимым синтаксисом в 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()
}

1 ответ

Решение

В Kotlin присвоение не является выражением, значение которого равно присвоенному значению.

Вы можете объединить два утверждения, используя run Функция в Котлине. Эта функция возвращает значение последнего выражения.

var current = ""
while (run {
    current = bufferedReader.readLine()
    current != null
}) { // or while (run { current = bufferedReader.readLine(); current != null }) {
    lastLine = current
}

Тем не менее, вы можете еще больше сократить код, используя File.forEachLine() в Котлине.

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

Или короче,

fun readLastLine(file: File): String {
    var lastLine = ""
    file.forEachLine { lastLine = it }
    return lastLine
}

Это использует BufferedReader и автоматически закрывается: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/for-each-line.html

Другие вопросы по тегам