簡體   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