Kotlin中问欠,兩個Boolean表達(dá)式可以使用and
連接,也可以使用&&
連接,那么他們的區(qū)別是什么呢垮斯?
現(xiàn)象
示例一
val args = arrayOf<String>()
when {
args.isNotEmpty() && (args[0].toLowerCase() == "sender") -> {
println("This is a sender")
}
args.isNotEmpty() && (args[0].toLowerCase() == "receiver") -> {
println("This is a receiver")
}
else -> {
println("This is nothing")
}
}
輸出
This is nothing
示例二
val args = arrayOf<String>()
when {
args.isNotEmpty() and (args[0].toLowerCase() == "sender") -> {
println("This is a sender")
}
args.isNotEmpty() and (args[0].toLowerCase() == "receiver") -> {
println("This is a receiver")
}
else -> {
println("This is nothing")
}
}
輸出
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
結(jié)論
使用
&&
連接兩個表達(dá)式時,會從左往右依次判定每個表達(dá)式的結(jié)果只祠,當(dāng)遇到某個表達(dá)式的結(jié)果為false
時兜蠕,則會直接返回整個表達(dá)式的結(jié)果為false
,不會再執(zhí)行接下來的表達(dá)式抛寝。使用
and
連接兩個表達(dá)式時熊杨,會執(zhí)行所有的表達(dá)式并收集結(jié)果,最后把and
兩邊的結(jié)果再做邏輯與操作得出最終結(jié)果盗舰。
分析
and
是kotlin類的一個方法晶府,很多類都可以擁有這個方法,而and
表達(dá)式兩邊如果都是Boolean的時候钻趋,則調(diào)用的是Boolean
的and
實(shí)現(xiàn)川陆。它的定義如下:
public class Boolean private constructor() : Comparable<Boolean> {
......
public infix fun and(other: Boolean): Boolean
......
}
所以可以看出,表達(dá)式中and
左邊是Boolean
類自己蛮位,and
右邊是輸入此方法的參數(shù)other
较沪。
- 對于表達(dá)式中
and
左邊的子表達(dá)式鳞绕,要調(diào)用Boolean
的and
方法,必須要先把左邊的子表達(dá)式變成一個對象后才能調(diào)用此對象的and
尸曼,所以左邊的子表達(dá)式會被執(zhí)行猾昆。 - 對于表達(dá)式中
and
右邊的子表達(dá)式,需要先被變成一個Boolean
對象后才能被傳入and
方法中骡苞,所以右邊的子表達(dá)式會被執(zhí)行垂蜗。 - 最終在
and
方法中對and
左右兩邊的表達(dá)是結(jié)果求值后返回才作為表達(dá)式最終的結(jié)果。
這就是為什么用and
連接兩個表達(dá)式時解幽,兩個表達(dá)式都會被執(zhí)行的原因贴见。
延伸
同理,or
與||
會有同樣的效果躲株。