Kotlin карта со ссылкой на функцию-член - PullRequest
0 голосов
/ 14 февраля 2020

Учитывая следующие два класса:

class Parent {
    val child : Child = Child()
}

class Child {
    fun doSomethingWithParent(parent : Parent) = Foo()
}

class Foo

И список Parents:

val list = List<Parent>(10){_ -> Parent()}

Вместо отображения с помощью

list.map { it.child.doSomethingWithParent(it) } // works

для использования ссылка на функцию doSomethingWithParent как

// does not work
list.map(Child::doSomethingWithParent)
list.map(Parent::child::doSomethingWithParent)

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Вы не можете сделать это

map требуется функция transform: (T) -> R (≈ KFunction1<T,R>)

Child::doSomethingWithParent равно KFunction2<Child, Parent, Foo> (≈ f: (Child, Parent) -> Foo). Это ссылка на метод, поэтому требуется объект, для которого будет вызываться функция (Child параметр)

Вы можете сделать что-то вроде этого:

class Parent {
    val child: Child = Child()

    fun foo() = child.doSomethingWithParent(this)
}

val l1 = list.map(Parent::foo)
1 голос
/ 15 февраля 2020

Подсказка в сообщениях об ошибках. (Вот почему, как правило, это хорошая идея, чтобы задать их в вопросе ...)

В вашей строке:

list.map(Child::doSomethingWithParent)

который ребенок должен сделать что-то с каждым указан родитель? Вы не указываете, что это дочерний элемент указанного в списке родителя.

А в вашей строке:

list.map(Parent::child::doSomethingWithParent)

что должен указывать второй ::? Parent::child является ссылкой на метод, а не на класс или объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...