【问题标题】:Is it better to use a lambda if a variable is not always needed?如果并不总是需要变量,使用 lambda 会更好吗?
【发布时间】:2020-01-15 17:17:48
【问题描述】:

我有一个无论如何都会加载的类,但如果单击则只需要一个参数。总是将参数传递给类还是传递一个 lambda 并在单击时调用它会更好吗?

示例:

class ItemViewModel(item: ProductItem,
                    private val index: Int,
                    private val title: String?){
    fun onItemClick() = foo(title)
}

class ItemViewModel(item: ProductItem,
                    private val index: Int,
                    private val getTitle: () -> String?){
    fun onItemClick() = foo(getTitle)

}

【问题讨论】:

  • 我真的很困惑 :) 显示您正在谈论的代码,不要害羞。此外,传递“变量”通常不需要担心(假设您不打算创建 4GB 字符串......)。
  • 添加了一个例子。这不是一个非常紧迫的问题,当我写这篇文章时,我认为答案将只是传递变量,因为它更具可读性。
  • 我更喜欢lamba方法,但在大多数情况下,这并不重要,更多的是根据具体情况。
  • 您似乎担心过早的优化。恕我直言,您应该始终努力编写简单而干净的代码,然后担心(在大多数情况下您不需要)任何优化。通过老式的方式传递前两个参数,然后将最后一项作为 lambda 类型传递,正如人们所说的那样,这打破了“规范”。在这种情况下,在经典方式上使用 lambda 不会产生任何性能优势。 TBH,该类没有提供读者信息,它需要 3 个参数的目的是什么。如果会首先担心分离关注点,即担心使其更具凝聚力。
  • Lambda 实际上可能比字符串消耗更多的内存,因为在 JVM 字节码中它无论如何都由 Object 表示。

标签: android kotlin memory-management lambda android-viewmodel


【解决方案1】:

您的问题和代码示例合二为一。

  1. 如果不总是需要变量,使用 lambda 会更好吗? 如果您使用的是 Kotlin(在您的示例中),那么您的参数可以设置为可选(您正在做的),方法是用 ? 标记它。 这意味着该函数的调用者可以将null 作为值传递,并且该函数应该按预期工作。

现在,如果您提前知道客户端会传递 null(或某个值),并且您不在乎它们是否会传递,并且您希望让客户端更容易调用此函数并且没有要传递参数,您可以将参数标记为? = null。 例如:

class ItemViewModel(item: ProductItem,
                    private val index: Int,
                    private val title: String? = null){
    fun onItemClick() = foo(title)
}

请记住,您的函数 foo 还必须接受此示例中可能的 null 值。

或者:

class ItemViewModel(item: ProductItem,
                    private val index: Int,
                    private val title: String? = "Default title"){
    fun onItemClick() = foo(title)
}

这意味着您现在可以将其称为ItemViewModel(ProductionItem.SomeItem, 1)。第三个参数是不需要的(但如果你传递一个参数,它仍然被接受)。

  1. Lambda 参数通常仅用于表示您需要的参数应该是回调。换句话说,您将传递一个类似“onComplete”的 lambda,并让客户端处理您的 foo 函数的响应。

  2. 通常,您不会将参数(不是回调)作为 lambda 传递。当然,你可以这样做,但这是一种非常奇怪的做法,没有人会理解你为什么这样做。

  3. 正如评论中提到的,lambdas 通常比变量消耗更多的内存(除非您的变量是序列化对象,如图像或类似的东西)

【讨论】:

  • 默认值或 null 在这种情况下不起作用,因为在任何时候,用户都可以单击该项目。我不知道何时初始化用户是否要点击。最好的做法似乎是始终传递字符串以清楚起见并防止不必要地创建更大的对象。
  • 抱歉,我试图解释如何设置默认值,因为这是 OP 询问的问题之一。实际用例可能是一个错误的例子。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 2021-08-09
  • 2018-02-22
  • 2014-05-03
  • 1970-01-01
  • 2014-09-03
  • 2017-04-09
  • 1970-01-01
相关资源
最近更新 更多