【问题标题】:Why should lambda argument be moved out of parentheses?为什么要将 lambda 参数移出括号?
【发布时间】:2021-12-03 12:00:40
【问题描述】:

Kotlin 编码约定 (https://kotlinlang.org/docs/coding-conventions.html#lambdas) 说: “如果调用采用单个 lambda,请尽可能将其传递到括号之外。”

此建议的原因是什么?就我个人而言,它是一个令人困惑的特殊情况,导致代码丑陋,但我想这可能是有充分理由的。

【问题讨论】:

    标签: kotlin conventions


    【解决方案1】:

    正如您所说,这只是一个建议,因为它使代码更易于阅读(在 JetBrains 的人们和我看来也是如此)。您的代码也可以工作,但它变得更难阅读。

    val list = emptyList<Int>()
    list.filter { it > 10 }  // no parentheses
    list.filter({it > 10})   // with parentheses and harder to read
    

    当您有类似上面的代码时,您可以在下面看到 IntelliJ 上“检查代码”操作的结果。这显然只是一个风格“问题”。

    【讨论】:

    • 如果 lambda 是唯一的参数,它是合理可读的(在我看来),但是当有一个不是唯一参数的 lambda 时,它就变得不好了。 someFn(someParam, someOtherParam) { it &gt; 10 }。您是否提到了一些 Intelij 官方通信,这纯粹是关于它们的可读性?
    • 不是官方交流,但我在答案中添加了一张图片,证明这只是一个风格问题。
    • 除了大多数人认为使用括号外的 lambda 更容易阅读之外,它 (1) 减少了您在编写代码时必须跟踪的右括号/大括号的数量。 lambda 通常在其中包含嵌套代码,这很重要。由于 Kotlin 具有内联函数和作用域函数,因此多行 lambda 比在 Java 中更为常见。 (2) 这种风格允许编写类似 DSL 的代码。如果无论如何都要在这些情况下使用,最好在任何地方都坚持一个约定。
    • 关于前面还有其他参数的情况,我想你在使用 Kotlin 代码时会发现它更有意义。它使它看起来有点像您将参数传递给的函数,这通常是您对具有多个参数的高阶函数所做的事情。 “有了这些东西,就这样吧。”如果您必须在括号内包含一个多行 lambda,那么您应该在哪里打开和关闭大括号,就没有很好的解决方案。它现在对你来说并不好,只是因为它对你来说是新的。
    • @Tenfour04 我来自 Python,其中 lambdas 很常见,但实际上不是多行的。并不是说不可能,风格问题:如果命名函数不适合在 1 行上,我会认为定义它更清晰,而不是尝试使其适合参数列表。好吧,无论如何,当在罗马时,就像罗马人一样。也许我会喜欢上它;很高兴尝试一种新方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2021-12-11
    • 2018-06-24
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多