在使用Android Switch
时,我附加了setOnCheckedChangeListener
并收到此警告
lambda表达式未使用。如果您指的是一个区块,则可以使用'运行{...}'
下面'代码片段:
switchAction.setOnCheckedChangeListener({
_, isChecked ->
{
preferences.userStatus = isChecked
switchToggleVisibility(isChecked)
if (isChecked) {
fetchStats()
getOrders()
} else {
releaseOrder()
}
}
})
使用run
确实可以修复此警告,但有谁知道这背后的原因? lambda表达式是如何未使用的?
答案 0 :(得分:21)
您将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而不返回或运行它,这就是你收到警告的原因。
答案 1 :(得分:4)
是的,
_, 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()
}
}