Android lambda表达式未使用
在使用Android的Android lambda表达式未使用,android,lambda,kotlin,Android,Lambda,Kotlin,在使用Android的开关时,我在其上附加了一个setOnCheckedChangeListener,并收到了这个警告 lambda表达式未使用。如果您指的是块,可以使用“run{…}” 下面是代码片段: switchAction.setOnCheckedChangeListener({ _, isChecked -> { preferences.userStatus = isChecked switchToggleVisibility(is
开关时,我在其上附加了一个setOnCheckedChangeListener
,并收到了这个警告
lambda表达式未使用。如果您指的是块,可以使用“run{…}”
下面是代码片段:
switchAction.setOnCheckedChangeListener({
_, isChecked ->
{
preferences.userStatus = isChecked
switchToggleVisibility(isChecked)
if (isChecked) {
fetchStats()
getOrders()
} else {
releaseOrder()
}
}
})
使用run
可以修复此警告,但有人知道其背后的原因吗?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()
}
}
您将Java的lambda表示法与Kotlin的lambda表示法混合,创建一个lambda,在本例中返回另一个嵌套的lambda。正确的惯用语法如下所示:
switchAction.setOnCheckedChangeListener { _, isChecked ->
preferences.userStatus = isChecked
switchToggleVisibility(isChecked)
if (isChecked) {
fetchStats()
getOrders()
} else {
releaseOrder()
}
}
{ arg1, arg2 -> returnValue } // Type: (A, B) -> C
{ arg1, arg2 -> { -> returnValue } } // Type: (A, B) -> (() -> C)
除去所有噪音,正常的lambda如下所示:
switchAction.setOnCheckedChangeListener { _, isChecked ->
preferences.userStatus = isChecked
switchToggleVisibility(isChecked)
if (isChecked) {
fetchStats()
getOrders()
} else {
releaseOrder()
}
}
{ arg1, arg2 -> returnValue } // Type: (A, B) -> C
{ arg1, arg2 -> { -> returnValue } } // Type: (A, B) -> (() -> C)
你做到了:
{ arg1, arg2 -> { returnValue } } // Type: (A, B) -> (() -> C)
也可以这样写:
switchAction.setOnCheckedChangeListener { _, isChecked ->
preferences.userStatus = isChecked
switchToggleVisibility(isChecked)
if (isChecked) {
fetchStats()
getOrders()
} else {
releaseOrder()
}
}
{ arg1, arg2 -> returnValue } // Type: (A, B) -> C
{ arg1, arg2 -> { -> returnValue } } // Type: (A, B) -> (() -> C)
这个符号更清楚地表明lambda不返回返回值,而是返回另一个没有返回返回值的参数的lambda
通常,编译器会发现这是错误的返回类型,但在您的情况下,不会使用lambda的返回值。因此,您只是创建内部lambda,而没有返回或运行它,这就是为什么您会收到警告。如果出现多个语句,我们必须使用大括号,对吗?@ShijenN我不太确定您在问什么?在Kotlin中,lambda始终只有一组大括号,它们在参数列表之前打开,在lambda的最后一个语句或返回表达式之后关闭。大括号必须在那里,不管lambda包含多少语句。也许你说的是if-and-when表达式?如果主体仅由一个语句/表达式组成,那么确实可以省略大括号,但如果主体中有多个语句,则必须包含大括号。不过,这些都不是兰姆达斯。