Включите как назначение, так и проверку назначенного значения в цикле 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