问题 如何在Kotlin中省略lambda参数?


有时我不使用所有lambda参数,例如下面示例中的第二个参数,这是更改事件中的旧值:

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

我该如何省略它们?导致代码混乱并损害可读性。以前我使用上面的方法,但在kotlin 1.0.0-beta-1103下划线是保留的。


9429
2017-10-30 06:51


起源

目前你不能 - Yaroslav
如果你经常使用lambda来保证这一点,你可以随时添加一个扩展函数,它对你不想删除的参数做同样的事情。 - eski


答案:


从1.1开始,你可以做到这一点:

未使用变量的下划线(自1.1起)

如果lambda参数未使用,则可以放置下划线   它的名字:

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

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

我应该补充一点,编译器现在会为未使用的lambda参数生成警告,并为Android Studio提供了一个新的相应快速修复


6
2018-03-02 14:34





您可以使用 转义为Kotlin中关键字的Java标识符 (即反推)或超载 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
}

4
2017-12-03 17:38