Давайте посмотрим, что на самом деле является String::name
. Это KProperty1<Student, String>
. Этот интерфейс также реализует (Student) -> String
. Итак, мы на самом деле имеем дело с лямбдой, которая принимает Student
в качестве параметра и возвращает String
.
Теперь, что берет функция map
? Функция map
принимает лямбду, которая отображает один тип на другой ((T) -> R
), что означает, что мы можем передать ему Student::name
. Как и для любой функции, вы помещаете параметры в скобки.
list.map(Student::name) // variant 1
Если вы хотите определить свою собственную лямбду, вы можете сделать это следующим образом:
val lambda: (Student) -> String = { it.name }
list.map(lambda) // variant 2
Обратите внимание, как лямбда передается в скобках в качестве параметра. Эти скобки могут быть опущены, если вы вставите лямбду (а лямбда - последний параметр этой функции):
list.map { it.name } // variant 3
Давайте посмотрим, что с вами произошло. Вы передали ссылку внутри лямбды:
list.map { Student::name }
, что означает, что вы преобразуете любой элемент в списке в ссылку на свойство name. Итак, вы хотите go с вариантом 1, 2 или 3.