繁体   English   中英

未使用 lambda 表达式

[英]The lambda expression is unused

在使用 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 } // Type: (A, B) -> C

你这样做了:

{ arg1, arg2 -> { returnValue } } // Type: (A, B) -> (() -> C)

也可以这样写:

{ arg1, arg2 -> { -> returnValue } } // Type: (A, B) -> (() -> C)

这种表示法更清楚地表明 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()
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM