使用 elvis 运算符的 Kotlin 字符串连接
Kotlin String Concatenation using elvis operator
System.out.println(student != null ? student.name != null ? student.name + " is my mame" : "Name is Null" : "Student is Null ");
如果值不为空,我想连接字符串。我可以在 java 内完成。如何在科特林中做到这一点?
您可以使用 if
表达式执行与 Java 中相同的操作,但是使用三元表达式已经很可怕了,所以我不建议这样做(无论是 Java 还是在 Kotlin 中):
val text = if (student != null) if (student.name != null) "${student.name} is my name" else "Name is null" else "Student is null"
println(text)
反转稍微好一点,但仍然很难看:
val text = if (student == null) "Student is null" else if (student.name == null) "Name is null" else "${student.name} is my name"
println(text)
您也可以混合使用 let
+ elvis,但这会使它的可读性比 if
IMO 更差:
val text = student?.let { s -> s.name?.let { "$it is my name" } ?: "Name is null" } ?: "Student is null"
println(text)
所以总而言之,我相信使用 when
会使它更清晰一些:
val text = when {
student == null -> "Student is null"
student.name == null -> "Name is null"
else -> "${student.name} is my name"
}
println(text)
请注意,首先避免这种空值扩散可能更合适。例如,这里的学生姓名可以为 null 似乎很奇怪,也许一开始就不可能创建没有姓名的学生。
使用 safenull (?)
和 elvis(?:)
运算符
var output = student?.let{ model ->
model.name?.let{ nm ->
"$nm is my mame"
} ?: "Name is Null"
} ?: "Student is Null "
print(output)
您可以做的另一件事:
val message = student?.name?.let { "$it is my name" }
?: "${ if (student == null) "Student" else "Name"} is null"
println(message)
这是一个非常典型的模式 - 使用链式 null 检查,如果您在整个过程中没有遇到 null,则对值执行某些操作。如果这样做,请执行一些默认/回退处理(在 ?:
elvis 运算符之后)。
如果处理需要变得复杂,@Joffrey 的回答中的 when
方法可能更简洁。但这就是您经常在一行中处理嵌套可空值的方式 - 如果您是 运行 一个操作而不是返回一个值,通常您根本不需要回退部分。只是“如果我可以访问这个 属性 而不会遇到 null,就用它来做”
System.out.println(student != null ? student.name != null ? student.name + " is my mame" : "Name is Null" : "Student is Null ");
如果值不为空,我想连接字符串。我可以在 java 内完成。如何在科特林中做到这一点?
您可以使用 if
表达式执行与 Java 中相同的操作,但是使用三元表达式已经很可怕了,所以我不建议这样做(无论是 Java 还是在 Kotlin 中):
val text = if (student != null) if (student.name != null) "${student.name} is my name" else "Name is null" else "Student is null"
println(text)
反转稍微好一点,但仍然很难看:
val text = if (student == null) "Student is null" else if (student.name == null) "Name is null" else "${student.name} is my name"
println(text)
您也可以混合使用 let
+ elvis,但这会使它的可读性比 if
IMO 更差:
val text = student?.let { s -> s.name?.let { "$it is my name" } ?: "Name is null" } ?: "Student is null"
println(text)
所以总而言之,我相信使用 when
会使它更清晰一些:
val text = when {
student == null -> "Student is null"
student.name == null -> "Name is null"
else -> "${student.name} is my name"
}
println(text)
请注意,首先避免这种空值扩散可能更合适。例如,这里的学生姓名可以为 null 似乎很奇怪,也许一开始就不可能创建没有姓名的学生。
使用 safenull (?)
和 elvis(?:)
运算符
var output = student?.let{ model ->
model.name?.let{ nm ->
"$nm is my mame"
} ?: "Name is Null"
} ?: "Student is Null "
print(output)
您可以做的另一件事:
val message = student?.name?.let { "$it is my name" }
?: "${ if (student == null) "Student" else "Name"} is null"
println(message)
这是一个非常典型的模式 - 使用链式 null 检查,如果您在整个过程中没有遇到 null,则对值执行某些操作。如果这样做,请执行一些默认/回退处理(在 ?:
elvis 运算符之后)。
如果处理需要变得复杂,@Joffrey 的回答中的 when
方法可能更简洁。但这就是您经常在一行中处理嵌套可空值的方式 - 如果您是 运行 一个操作而不是返回一个值,通常您根本不需要回退部分。只是“如果我可以访问这个 属性 而不会遇到 null,就用它来做”