Подтвердить что ты не робот

Как опустить параметры лямбда в Котлин?

Иногда я не использую все параметры лямбда, как второй параметр в приведенном ниже примере, который является старым значением в событии изменения:

selected.onChange { value, _ ->
    checkBox.isChecked = value
}

Как опустить их? Причина, которая загромождает код и ущемляет читаемость. Раньше я использовал метод выше, но в kotlin 1.0.0-beta-1103 подчеркивания зарезервированы.

4b9b3361

Ответ 1

Начиная с версии 1.1, вы можете сделать именно это:

Подчеркивание для неиспользуемых переменных (начиная с 1.1)

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

map.forEach { _, value -> println("$value!") }

https://kotlinlang.org/docs/reference/lambdas.html#underscore-for-unused-variables-since-11

Я должен добавить, что теперь компилятор генерирует предупреждение о неиспользуемых параметрах лямбда, а также новое соответствующее быстрое исправление для Android Studio

Ответ 2

Вы можете использовать экранирование для идентификаторов Java, которые являются ключевыми словами в Kotlin (т.е. обратные ссылки) или перегрузка onChange.

Обратные кавычки

selected.onChange { value, `_` ->
    checkBox.isChecked = value
}

Перегрузка onChange

interface Listener<T1, T2> {
    fun onChange(f: (T1, T2) -> Unit) // original method
    fun onChange(f: (T1) -> Unit)     // new method
}

И если вы не можете изменить Listener<T1, T2> (или любой тип settable из вашего примера), вы можете использовать функцию расширения:

fun <T1, T2> Listener<T1, T2>.onChange(f: (T1) -> Unit) = onChange { t1, t2 -> f(t1) }

Затем вы можете вызвать onChange, как вы хотите:

selected.onChange { value ->
    checkBox.isChecked = value
}