如何在Kotlin中省略lambda参数?

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

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

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

从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有一个新的相应的快速修复

您可以使用转义为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> (或者你的示例中可以设置的任何类型),那么你可以使用一个扩展函数 :

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

然后你可以打电话来改变你想要的:

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