首页 > 解决方案 > 如果并不总是需要变量,使用 lambda 会更好吗?

问题描述

我有一个无论如何都会加载的类,但如果单击则只需要一个参数。总是将参数传递给类还是传递一个 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)

}

标签: androidkotlinmemory-managementlambdaandroid-viewmodel

解决方案


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

  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 通常比变量消耗更多的内存(除非你的变量是一个序列化的对象,比如图像或类似的东西)


推荐阅读