Помогите разобраться в синтаксисе Kotlin

Вот конкретно пример который вызывает у меня затруднения:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_fragment_tasks, menu)

        val searchItem = menu.findItem(R.id.action_search)
        val searchView = searchItem.actionView as SearchView

        searchView.onQueryTextChanged {
            viewModel.searchQuery.value = it
        }
    }

Самая непонятная часть:

inline fun SearchView.onQueryTextChanged(crossinline listener: (String) -> Unit) {
    this.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            listener(newText.orEmpty())
            return true
        }
    })
}

Вопросы: Почему вызов функции происходит без обычных скобок ()?

Что конкретно передается и возвращается при вызове метода? или иначе говоря что Это Такое?:

searchView.onQueryTextChanged {
            viewModel.searchQuery.value = it
        }

И что это значит?:

crossinline listener: (String) -> Unit
//
listener(newText.orEmpty())

Ответы (1 шт):

Автор решения: Bleser

Высокоуровневые функции и лямбды

Если первым и единственным параметром в функцию передается лямбда, то можно не писать (), а сразу писать { a, b -> a + b }, где a и b параметры передаваемые в лямбду.

Если последним параметром передается лямбда, то её так же можно вынести в фигурные скобки.

searchView.onQueryTextChanged {
    viewModel.searchQuery.value = it
}

onQueryTextChanged имеет параметр типа f: (T) -> Unit. it это ключевое слово которое можно использовать вместо явного указания параметра лямбды.
Так же можно было бы написать:

searchView.onQueryTextChanged { query ->
    viewModel.searchQuery.value = query
}


crossinline listener: (String) -> Unit
//
listener(newText.orEmpty())

С этим еще не сталкивался, но в доке пишут, что это нужно в inline функциях.
Можно почитать об этом тут.

→ Ссылка