在Kotlin函数中传递值时遇到问题。正在转换的变量:(字符串)->;R

在Kotlin函数中传递值时遇到问题。正在转换的变量:(字符串)->;R,kotlin,generics,Kotlin,Generics,我这里有一些代码,它读取一个文件并根据传递给函数的内容将其转换为一个类型列表。这个函数的代码看起来是这样的 fun <R> readFile(path:String,convert:(String)->R): List<R> { val reader = BufferedReader(FileReader(File(path))) var line = reader.readLine() val result = mutableListOf&

我这里有一些代码,它读取一个文件并根据传递给函数的内容将其转换为一个类型列表。这个函数的代码看起来是这样的

fun <R> readFile(path:String,convert:(String)->R): List<R> {
    val reader = BufferedReader(FileReader(File(path)))
    var line = reader.readLine()
    val result = mutableListOf<R>()
    while(line!=null) {
        result.add(convert(line))
        line = reader.readLine()
    }
    reader.close()
    return result.toList()
}
这样一来,我的类型就出现了一个错误。Intellij正在标记“Required(String)->?”

类型
(String)->R
是一个。它表示一个函数,该函数将
字符串
作为参数,并返回
R
(这是通用的,在每次调用
readFile()
时可能会有所不同)

要调用
readFile()
,需要传递
字符串和函数:

readFile(“path/person.txt”){line->/*您需要的任何内容*/}
注意,在Kotlin中,
{line->…}
是一个函数文本。这个特殊的lambda表达式表示一个函数,它接受参数
,并执行正文中的任何操作

Lambda表达式可以从函数调用的括号中传递出去,但它仍然是函数的参数。上述代码相当于:

readFile(“path/person.txt”,{line->/*您需要的任何内容*/})
在您的特定情况下,
convert
参数是一个转换函数,因此您需要提供一些代码,将
line:String
参数转换为输出列表中所需的任何
R
类型

如果您只想将行列表作为字符串(无需转换),只需提供identity函数:

readFile(“path/person.txt”){line->line}
简言之:

readFile(“path/person.txt”){it}

it
是lambda表达式的隐式参数(快捷方式),表示只有一个参数的函数,这里就是这种情况。

谢谢您,我不习惯将函数作为参数传递,我是Kodlin的新手
val listOfPerson = readFile("path/person.txt","Person")