Почему я могу использовать Observer (adapter :: submitList) вместо Observer {adapter.submitList (it) в Kotlin? - PullRequest
0 голосов
/ 07 апреля 2020

Код А легко понять.

Но многие люди используют viewModel.allCheeses.observe(this, Observer(adapter::submitList)) вместо viewModel.allCheeses.observe(this, Observer { adapter.submitList(it) }).

На мой взгляд, символ :: указывает что это класс в Kotlin.

Код A

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val adapter = CheeseAdapter()
        cheeseList.adapter = adapter

        viewModel.allCheeses.observe(this, Observer { adapter.submitList(it) })
        //viewModel.allCheeses.observe(this, Observer(adapter::submitList))


        initAddButtonListener()
        initSwipeToDelete()
}



public interface Observer<T> {
    /**
     * Called when the data is changed.
     * @param t  The new data
     */
    void onChanged(T t);
}

1 Ответ

1 голос
/ 07 апреля 2020

Это конкретное использование является связанной ссылкой на метод :

. Вы можете ссылаться на метод экземпляра определенного объекта:

val numberRegex = "\\d+".toRegex()
println(numberRegex.matches("29"))

val isNumber = numberRegex::matches
println(isNumber("29"))

Вместо вызов метода соответствует непосредственно, мы храним ссылку на него. Такая ссылка связана с его получателем. Его можно вызвать напрямую (как в примере выше) или использовать всякий раз, когда ожидается выражение типа функции:

val numberRegex = "\\d+".toRegex()
val strings = listOf("abc", "124", "a70")
println(strings.filter(numberRegex::matches))

Сравните типы связанных и соответствующих несвязанных ссылок. Связанный вызываемый эталон имеет свой получатель, «привязанный» к нему, поэтому тип получателя больше не является параметром:

val isNumber: (CharSequence) -> Boolean = numberRegex::matches
val matches: (Regex, CharSequence) -> Boolean = Regex::matches
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...