android - 如果并不总是需要变量,使用 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)
}
解决方案
您的问题和代码示例合二为一。
- 如果并不总是需要变量,使用 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)
. 不需要第三个参数(但如果您确实传递了一个参数,它仍然可以接受)。
Lambda 参数通常仅用于表示您需要的参数应该是回调。换句话说,您将传递一个类似“onComplete”的lambda,并让客户端处理您的
foo
函数的响应。按照惯例,您不会将参数(不是回调)作为 lambda 传递。当然,你可以做到,但这是一种非常奇怪的做法,没有人会理解你为什么这样做。
正如评论中提到的,lambdas 通常比变量消耗更多的内存(除非你的变量是一个序列化的对象,比如图像或类似的东西)
推荐阅读
- javascript - 如何在 jupyter notebook 中为 SQL 行魔术、单元魔术和自定义命令添加语法高亮?
- karate - 如何使用 * def result = call read('classpath:some-reusable-steps.feature') 读取功能文件中的特定场景?
- assemblyscript - 在 AssemblyScript 中实例化数组的三种不同方法
- c# - 如何使用带有 Json.NET 的 snake_case 序列化 ExpandoObjects?
- reactjs - React/Ionic 路由:无法读取未定义的属性“startsWith”
- c++ - 如何将计算矩阵转置的函数的结果传递给另一个打印矩阵的函数?
- azureservicebus - 如何在 Azure 门户中启用/禁用批处理操作?
- cordova - Cordova InAppBrowser _self 不执行监视位置代码
- python-3.x - 修改包含多个 XML 文件的大文件以根据条件创建小文件
- r - 为什么当X是张量时tensorflow split函数会报错