lambda表达式是未使用的

在使用Android的Switch ,我附加了一个setOnCheckedChangeListener ,并得到了这个警告

lambda表达式是未使用的。 如果你的意思是块,你可以使用'run {…}'

这里的代码片段:

 switchAction.setOnCheckedChangeListener({ _, isChecked -> { preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } } }) 

使用run确实解决了这个警告,但有没有人知道背后的原因? lambda表达式如何不被使用?

您将Java的lambda表示法与Kotlin的lambda表示法混合,创建一个lambda表达式,在这种情况下返回另一个嵌套的lambda表达式。 正确和惯用的语法如下所示:

 switchAction.setOnCheckedChangeListener { _, isChecked -> preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } } 

把所有的噪音拿出来,一个正常的lambda看起来像这样:

 { arg1, arg2 -> returnValue } 

你做到了这一点:

 { arg1, arg2 -> { returnValue } } 

也可以这样写:

 { arg1, arg2 -> { -> returnValue } } 

这个表示法使得它更清晰一点,即lambda不返回返回值,但返回另一个没有返回返回值的参数的lambda。

通常情况下,这会被编译器作为一个错误的返回类型来捕获,但是在你的情况下,lambda的返回值没有被使用。 所以,你只是创建内部lambda而不返回或运行它,这就是为什么你得到一个警告。

是的

 _, isChecked -> { ... } 

必须改成

 _, isChecked -> preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } 

所以,只要删除大括号,否则你只是创建一个根本不执行的块。 或者你也可以做

 _, isChecked -> run { preferences.userStatus = isChecked switchToggleVisibility(isChecked) if (isChecked) { fetchStats() getOrders() } else { releaseOrder() } }