class Student(val id: Int, val name: String)
fun main() {
val list = arrayListOf<Student>(Student(200, "Lim"), Student(100, "Kim"), Student(300, "Park"))
println(list.map { Student::name })
println(list.map { student -> student.name })
}
Run Code Online (Sandbox Code Playgroud)
结果:
[val Student.name: kotlin.String, val Student.name: kotlin.String, val Student.name: kotlin.String]
[Lim, Kim, Park]
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。
让我们来看看究竟String::name是什么。它是一个 KProperty1<Student, String>. 这个接口也实现(Student) -> String了。所以,我们实际上是在处理一个 lambda,它以 aStudent作为参数并返回 a String。
现在,这个map函数需要什么?该map函数采用一个将某种类型映射到另一种类型的 lambda ( (T) -> R),这意味着我们可以传递Student::name给它。就像对于任何函数一样,您将参数放在括号内。
list.map(Student::name) // variant 1
Run Code Online (Sandbox Code Playgroud)
如果你想定义你自己的 lambda,你可以这样做:
val lambda: (Student) -> String = { it.name }
list.map(lambda) // variant 2
Run Code Online (Sandbox Code Playgroud)
请注意 lambda 如何在括号内作为参数传递。如果您内联 lambda(并且 lambda 是该函数的最后一个参数),则可以省略这些括号:
list.map { it.name } // variant 3
Run Code Online (Sandbox Code Playgroud)
让我们看看你怎么了。您在 lambda 中传递了引用:
list.map { Student::name }
Run Code Online (Sandbox Code Playgroud)
这意味着您将列表中的任何元素转换为 name 属性的引用。所以,你想要的是变体 1、2 或 3。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |