Kotlin中在when语句内判断数组与列表大小的问题咨询
解答你的Kotlin When语句困惑
嘿,刚接触Kotlin就迷上模式匹配的理念,真的很有眼光——when语句确实是Kotlin里超灵活的特性!我完全能理解你遇到这种“逻辑矛盾”时的疑惑,咱们一步步拆解问题。
首先,根据你的描述,我猜你的代码大概是类似这样的:
val sampleList = listOf("a", "b") val sampleArray = arrayOf("x", "y", "z") when { sampleList.size == sampleArray.size -> println("false") // 你以为这个分支只在size相等时执行 else -> println("true") } // 对应的if语句 if (sampleList.size == sampleArray.size) { println("这个if从未执行") }
你说当列表和数组size不同时,when的第一个分支居然触发了,打印出"false",但if语句(判断size相等)从来没执行——这看起来完全矛盾,对吧?
问题出在哪?
最可能的原因是你把when分支的条件写反了!比如你原本想表达“当size相等时打印true,否则打印false”,但实际写的是:
- when的第一个条件是
sampleList.size != sampleArray.size(判断size不等),然后在这个分支里打印了"false" - 而你的if语句是判断
size相等,所以当size不等时,if自然不会执行,但when的第一个条件满足,就打印了"false"
另一种可能是你在when里误用了条件的逻辑关系,比如用了逗号分隔多个条件(Kotlin里when的逗号是逻辑或的意思),比如:
when { sampleList.size == 2, sampleArray.size == 3 -> println("false") // 只要其中一个条件满足就会进入分支,哪怕size实际不等 }
怎么修正?
先明确你的需求:如果列表和数组size相等,打印true;否则打印false。那正确的when写法应该是:
val sampleList = listOf("a", "b") val sampleArray = arrayOf("x", "y", "z") when { sampleList.size == sampleArray.size -> println("true") else -> println("false") } // 对应的if语句也会在size相等时触发 if (sampleList.size == sampleArray.size) { println("现在这个if会执行啦") }
另外,如果你想用when的表达式特性(更符合模式匹配的理念),可以直接把结果赋值给变量,代码更简洁:
val sizeMatch = when (sampleList.size == sampleArray.size) { true -> "true" false -> "false" } println(sizeMatch) // 或者更简洁的写法 val sizeMatchShort = if (sampleList.size == sampleArray.size) "true" else "false" println(sizeMatchShort)
额外提醒:列表和数组的size属性
Kotlin里List的size和Array的size都是直接返回元素个数,不存在类型差异导致的计算错误,所以只要条件写对,逻辑肯定是符合预期的。
内容的提问来源于stack exchange,提问作者Vdav
相关产品推荐
相关产品推荐

