我有一段验证代码,不认为它符合好的科特林的精神,
在这段代码中,我比较数据类的内容:网络工作者:网络工作者和工作者:网络工作者
if (networker.name != worker.name && networker.name != null) {
worker.name = networker.name
}
if (networker.lastName != worker.lastName && networker.lastName != null) {
worker.lastName = networker.lastName
}
if (networker.phone != worker.phone && networker.phone != null) {
worker.phone = networker.phone
}
if (networker.email != worker.email && networker.email != null) {
worker.email = networker.email
}我如何用更好更优雅的Kotlin代码来改进这一点?
发布于 2019-12-04 09:54:08
如果你最关心的是优雅,那么你可以这样写。
worker.name = networker.name ?: worker.name
worker.lastName = networker.lastName ?: worker.lastName
worker.phone = networker.phone ?: worker.phone
worker.email = networker.email ?: worker.email这个结果与您的代码相同(将值从一个网络工作者复制到另一个工作人员,除了空值),但我认为它更好看。
发布于 2019-12-04 09:59:18
因为下面的条件赋值是没有意义的
if (X != Y) {
Y = X
}由于没有此检查,赋值的结果将是相同的,因此您可以省略它,并且只能通过.let {}保留空检查。
networker.name?.let { worker.name = it }
networker.lastName?.let { worker.lastName = it }
networker.phone?.let { worker.phone = it }
networker.email?.let { worker.email = it }发布于 2019-12-04 11:43:02
除了在其他答案中提到的低级改进之外,我还会考虑将这些代码放在哪里。
由于所有这些行都在完成单个任务--从另一个对象中更新--将它们绑定到一个函数中是有意义的;这不仅清楚地关联了它们,而且还允许您给它们一个描述性的名称。
其中最明显的地方是数据类本身;可能是一个名为updateFrom(other: Networker)的方法,它更新了调用对象的对象,这将使调用者清楚地看到对象正在发生变异。
但是,有时您希望将数据类保持为简单的数据持有者,或者对它们没有控制权。在这种情况下,它可能是一个扩展函数。
https://stackoverflow.com/questions/59173101
复制相似问题