若 lastName
为 null,则 name
即为 firstName
或 "Unknown"
,具体如下:
if (lastName != null) {
if (firstName != null) {
name = "$firstName $lastName"
} else {
name = lastName
}
} else if (firstName != null) {
name = firstName
} else {
name = "Unknown"
}
通过使用 Elvis 运算符 ?:
,我们将能以更惯常的方式编写代码。若左侧表达式不为 null,则 Elvis 运算符将返回该表达式,否则便会返回右侧表达式。
基于此,若 user.firstName
不为 null,以下代码便会返回此值。若 user.firstName
为 null,该表达式将返回右侧值 "Unknown"
,具体如下:
if (lastName != null) {
...
} else {
name = firstName ?: "Unknown"
}
您可在官方文档中阅读有关 Elvis 运算符的更多内容。
编译器无法保证线程安全,这是由于 lastName
是可变属性,它可能会在我们执行 null 检查到实际返回该属性的时间段内发生更改。
下面我们将在 formattedUserNames 的
get 方法中同样采用 Elvis 运算符:
val formattedUserNames: List<String>
get() {
val userNames = ArrayList<String>(users.size)
for ((firstName, lastName) in users) {
val name: String
if (lastName != null) {
if (firstName != null) {
name = "$firstName $lastName"
} else {
name = lastName ?: "Unknown"
}
} else {
name = firstName ?: "Unknown"
}
userNames.add(name)
}
return userNames
}