Elvis
运算符(?:
)用于返回非null
值,即使条件表达式为null
。 它还用于检查值的空安全性。
在某些情况下,可以声明一个保存空引用的变量。 假设一个包含空引用的变量str
,在程序中使用str
之前将检查它的可空性。 如果发现变量str
不为null
,则其属性将使用,否则使用其他非空值。
var str: String? = null var str2: String? = "May be declare nullable string"
在上面的代码中,str
包含一个null
值,在访问str
的值之前需要执行安全检查,字符串是否包含值。 在传统方法中,使用if...else
语句执行此安全检查。
var len1: Int = if (str != null) str.length else -1 var len2: Int = if (str2 != null) str.length else -1
示例代码 -
fun main(args: Array<String>){ var str: String? = null var str2: String? = "May be declare nullable string" var len1: Int = if (str != null) str.length else -1 var len2: Int = if (str2 != null) str2.length else -1 println("Length of str is ${len1}") println("Length of str2 is ${len2}") }
执行上面示例代码,得到以下结果 -
Length of str is -1 Length of str2 is 30
Kotlin提供称为Elvis运算符(?:
)的高级运算符,即使条件表达式为空,也返回非空值。 以上if...else
运算符可以使用Elvis运算符表示如下:
var len1: Int = str?.length ?: -1 var len2: Int = str2?.length ?: -1
Elvis运算符将表达式返回?: -1
。 (str ?.length
)如果它不为null
,否则它将表达式返回?:
, 即-1
。 仅当左侧返回null
时,才会评估Elvis运算符的右侧表达式。
Kotlin Elvis运算符示例
fun main(args: Array<String>){ var str: String? = null var str2: String? = "May be declare nullable string" var len1: Int = str ?.length ?: -1 var len2: Int = str2 ?.length ?: -1 println("Length of str is ${len1}") println("Length of str2 is ${len2}") }
执行上面示例代码,得到以下结果 -
Length of str is -1 Length of str2 is 30
当Kotlin抛出并返回一个表达式时,它们也可以在Elvis运算符的右侧使用。 这可以用于检查函数参数:
funfunctionName(node: Node): String? { val parent = node.getParent() ?: return null val name = node.getName() ?: throw IllegalArgumentException("name expected") // ... }
Kotlin Elvis运算符使用throw和return表达式
fun main(args: Array<String>){ val fruitName: String = fruits() println(fruitName) } fun fruits(): String{ val str: String? ="abc" val strLength: Int = if(str!= null) str.length else -1 val strLength2: Int = str?.length ?: -1 var string = "str = $str\n"+ "strLength = $strLength\n"+ "strLength2 = $strLength2\n\n" fun check(textOne: String?, textTwo: String?): String?{ val textOne = textOne ?: return null val textTwo = textTwo ?: IllegalArgumentException("text exception") return "\ntextOne = $textOne\n"+ "textTwo = $textTwo\n" } string += "check(null,\"mango\") = ${check(null,"mango")}\n" + "check(\"apple\",\"orange\") = ${check("apple","orange")}\n" return string }
执行上面示例代码,得到以下结果 -
str = abc strLength = 3 strLength2 = 3 check(null,"mango") = null check("apple","orange") = textOne = apple textTwo = orange