【问题标题】:Wrong return type in `map` Kotlin`map` Kotlin 中的错误返回类型
【发布时间】:2021-03-06 19:49:34
【问题描述】:

我不知道我那段死气沉沉的 Kotlin 代码出了什么问题:

fun scan(): List<File> {
    val comics: List<File> = ArrayList()

    val extPath = Environment.getExternalStorageDirectory().absolutePath.toString()
    File(extPath).walkTopDown()
        .forEach { file ->
            if (isComic(file)) {
                comics.add(file)
            }
        }

    return comics
}


fun getComics(): List<Comic> {
    return scan().map { comicFile ->
        val comic = Comic()
        comic.path = comicFile.path.toString()
        return comic
    }
}

(我知道getExternalStorageDirectory() 现在已经贬值了,这只是 Kotlin 速成课程的一种快速肮脏的方式)

Android Studio 抱怨我应该在转换函数中返回List&lt;Comic&gt;

【问题讨论】:

    标签: android dictionary kotlin


    【解决方案1】:
        fun getComics(): List<Comic> {
        return scan().map { comicFile ->
            val comic = Comic()
            comic.path = comicFile.path.toString()
            comic
        }
    }
    

    去掉'return',{}是一个内联函数,如果你在内联函数中使用'return Comic',它将返回'comic: Comic'作为getComics()的结果

    【讨论】:

      【解决方案2】:

      内联lambda中的return语句用于从父函数范围返回,这种情况下可以使用限定返回或最后一行:

      fun getComics(): List<Comic> {
          return scan().map { comicFile ->
              val comic = Comic()
              comic.path = comicFile.path.toString()
              return@map comic  // qualified returns
          }
      }
      

      如果 lambda 名称不明确且嵌套在 map name@ { return@name ... } 中,您还可以更改它们的名称。

      但实际上你可以做到这一点:

      fun getComics(): List<Comic> {
          return scan().map { comicFile ->
              Comic().apply { path = comicFile.path.toString() }  // last line return
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多