Как опустить параметры лямбда в Котлин?
Иногда я не использую все параметры лямбда, как второй параметр в приведенном ниже примере, который является старым значением в событии изменения:
selected.onChange { value, _ ->
checkBox.isChecked = value
}
Как опустить их? Причина, которая загромождает код и ущемляет читаемость. Раньше я использовал метод выше, но в kotlin 1.0.0-beta-1103 подчеркивания зарезервированы.
Ответы
Ответ 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
}