使用 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,就用它来做”