Есть ли простой способ конвертировать лямбда в полное выражение в Kotlin с Android Studio 3.5.1? - PullRequest
2 голосов
/ 06 октября 2019

Код в popup.setOnMenuItemClickListener является лямбда-выражением, функция кода - отображать всплывающее меню.

Иногда трудно понять лямбда-выражение.

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

Код

 private fun showPopup(v: View, mContext: Context) {
        val popup = PopupMenu(mContext, v)
        popup.inflate(R.menu.menu_popup_more)

        popup.setOnMenuItemClickListener {
             when (it.itemId) {
                   R.id.MenuMoreAbout->{
                    requireActivity().openActivity<UIAbout>()
                   }
             }
            true  // Why do I need add 'true'
        }
        popup.show()
    }

1 Ответ

3 голосов
/ 06 октября 2019

Есть ли простой способ преобразовать лямбду в полное выражение?

Да, есть! Сначала поместите курсор на первую фигурную скобку

                     Position your cursor at this character
                                 |
                                 v

popup.setOnMenuItemClickListener {
    when (it.itemId) {
        R.id.MenuMoreAbout->{
            requireActivity().openActivity<UIAbout>()
        }
    }
    true  // Why do I need add 'true'
}

, затем введите Alt + Enter ( Option + Enter для Mac), чтобы вызвать меню Quick Fix . Выберите Преобразовать в анонимную функцию . Это превратит код в следующее:

popup.setOnMenuItemClickListener(fun(it: MenuItem): Boolean {
    when (it.itemId) {
        R.id.MenuMoreAbout -> {
            requireActivity().openActivity<UIAbout>()
        }
    }
    return true
})

, что более понятно для новичка в синтаксисе Kotlin.

Как видно, ваше выражение true было возвращаемым значениемлямбды. В Kotlin возвращаемое значение лямбды - это значение последнего выражения в лямбде. Если вы предпочитаете, вы можете сделать это явно, заменив

true  // Why do I need add 'true'

на

return@setOnMenuItemClickListener true

в вашем исходном коде. См. Официальные документы для Return в Labels для получения дополнительной информации.

Причина, по которой должен быть возвращен Boolean, заключается в том, что лямбда-код для следующего интерфейса Java является типом аргументана setOnMenuItemClickListener(OnMenuItemClickListener)

    public interface OnMenuItemClickListener {
        boolean onMenuItemClick(MenuItem item);
    }

Как видите, onMenuItemClick(MenuItem) возвращает boolean (который конвертируется в Boolean в Kotlin). Таким образом, лямбда также должна возвращать Boolean.

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