簡體   English   中英

使用 Kotlin lambda 表達式時刪除括號有什么好處?

[英]What is the benefit in removing parentheses when using Kotlin lambda expressions?

考慮這里給出的這個例子: https://stackoverflow.com/a/53376287/11819720

fun onClick(action: () -> Unit) { ... } 

view.onClick({ toast(it.toString())} )
view.onClick() {toast(it.toString()) }
view.onClick { toast(it.toString()) }

這個代碼:

fun convert(x: Double, converter: (Double) -> Double): Double{
    val result = converter(x)
    println("$x is converted to $result")
    return result
}
fun convertFive (converter: (Int) -> double): Double{
    val result = converter(5)
    println(" 5 is converted to $result")
    return result
}
fun main (args: Array<String>){
    convert(20.0) { it * 1.8 + 32 }
    convertFive { it * 1.8 + 32 }
}

似乎努力是為了節省寫一些括號的風險,以免使讀者感到困惑。 如果保持標准不是更好嗎? 在第二個示例中使用函數的常用方法是:

convert(20, {it * 1.8 + 32})
convertFive({it * 1.8 = 32})

但 IntelliJ 會抱怨並建議將 lambda 移出括號。 為什么? 有實際的好處嗎? 好像寫10 + 2 * 5 / 34而不是10 + (2 * 5) / 34

根本沒有實際的好處,它只是一個約定。

關於您所說的“保持標准”。 你究竟從哪里得到“通常的方式”? 我知道沒有全球編程約定,只有特定於語言的約定,所以這種表示法在定義上是標准的。

約定很重要,因為它們使任何熟悉語法的人閱讀代碼的工作量大大減少。 約定還反映了語言的使用。 借助 Kotlin,他們通過大量使用 lambdas 和內聯函數來推廣一種非常實用的風格,因此“括號外的 lambdas”對於保持代碼的簡潔和明確是必要的。

同樣正如@Tenfour04 在評論中所說,您的示例確實沒有反映語法的預期用法。 通常你有多行,即使你沒有,模式也應該傳達更多的東西。 measureTimeMillis function 為例:

measureTimeMillis {

    askQuestion()
    comment()
    answerQuestion()
}

通過將 lambda 放在括號外,可以立即看出 function 的作用,即使對於非技術讀者來說,這正是約定的用途。

大括號 lambda 的真正好處是,就像所有最好的語言特性一樣,它改變了你的思維方式。

您提供的示例同樣用括號編寫,我同意 IntelliJ 建議始終使用尾隨形式是不必要的......

但是當我寫這樣的東西時:

with(someObject) {
    doSomething();
    doSomethingElse();
}

看起來我正在使用該語言的一個很酷的新功能,盡管我實際上只是在調用 function。

結果是人們開始思考他們可以編寫向語言添加東西的函數,因為他們有點可以,這導致他們為使用他們的代碼的人創造新的做事方式。

類型安全的構建器模式就是一個很好的例子。 許多 Kotlin 語言功能協同工作,因此,即使它只是調用函數和傳遞 lambda,它也為使用它的開發人員提供了新的體驗。

他們獲得了一種全新的方法來實例化復雜對象,這種方法比舊方法更自然,並且不需要為此添加任何語言 - 所有小的構建塊功能都可以用於許多其他事情。

更接近你的例子。 假設您需要轉換一個數字數組並將所有正數平方。 比較什么更容易閱讀:

val result = arrayOf(1.0, 2.0, -3.0).map({ number ->
        convert(number, {
            if (it > 0) it * it else it
        })
    })
val result = arrayOf(1.0, 2.0, -3.0).map { number ->
        convert(number) {
            if (it > 0) it * it else it
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM