Android lambda表达式未使用

Android lambda表达式未使用,android,lambda,kotlin,Android,Lambda,Kotlin,在使用Android的开关时,我在其上附加了一个setOnCheckedChangeListener,并收到了这个警告 lambda表达式未使用。如果您指的是块,可以使用“run{…}” 下面是代码片段: switchAction.setOnCheckedChangeListener({ _, isChecked -> { preferences.userStatus = isChecked switchToggleVisibility(is

在使用Android的
开关时,我在其上附加了一个
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表达式?如果主体仅由一个语句/表达式组成,那么确实可以省略大括号,但如果主体中有多个语句,则必须包含大括号。不过,这些都不是兰姆达斯。