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

标签 kotlin idioms

我正在寻找使用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()
}

最佳答案

在Kotlin中,赋值不是其值等于所赋值的表达式。

您可以在Kotlin中使用run函数合并两个语句。此函数返回最后一个表达式的值。

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

但是,您可以在Kotlin中使用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

关于kotlin - 在Kotlin的while循环中包括赋值和对赋值的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49102339/

相关文章:

android - 如何在Android Compose中使用otf类型的字体文件?

kotlin - 使用 ktor 将文件上传到 telegram bot api

java - 如何将java接口(interface)代码转换为kotlin代码?

clojure - 为clojure编写嵌套定义语句(如在方案中)的标准方法是什么?

android - kotlin 中的 HasSupportFragmentInjector 问题 - DispatchingAndroidInjector 为 null

kotlin - 使用Jackson使用模式反序列化Property

c++ - 使用 Copliens 1994 计数指针示例代码获取编译错误

ruby - 用于分解方法定义的惯用 Ruby

ruby - 使用 Ruby 时,我应该将方法调用放在初始化中吗?

R - 处理数据帧列表的惯用方式