我有一个方法,它以String作为输入并返回一个与其对应的Integer,如下所示:
fun getPriority(groupValue: String?): Int {
when (groupValue) {
"one" -> return 10
"Two" -> return 9
"THREE" -> return 8
else -> return 4
}
}
我的问题是,在这种情况下,字符串比较是考虑字符串的大小写还是忽略大小写?
答案 0 :(得分:2)
when
进行了equals
比较,因此确实区分大小写(另请参见String.equals
)。
可以通过多种方式来实现区分大小写的方式,其中一种已经由Willi Mentzel展示出来了...其他方式(取决于您要实现的目标):
fun getPriority(groupValue : String?) = when {
groupValue == null -> /* handle the null first, so you can concentrate null-safe on the rest later */ 4
groupValue.equals("one", ignoreCase = true) -> 10 /* ignoreCase = false is the default */
/* ... */
else -> 4
}
如果是那样的话,那么简单的Willis方法就足够了。
答案 1 :(得分:1)
是的,它是区分大小写的,因为String.equals
就像Roland所说的那样被调用。
使其不区分大小写:
fun getPriority(groupValue: String?) = when (groupValue?.toLowerCase()) {
"one" -> 10
"two" -> 9
"three" -> 8
else -> 4
}
提示:由于when
是一个表达式,因此您可以对函数使用表达式主体符号。
替代:
使用Map
代替when
。如果您的代码应该是动态的,这将变得特别方便。
val priorityMapping = mapOf(
"one" to 10,
"Two" to 9,
"THREE" to 8
)
fun getPriority(groupValue: String?): Int {
groupValue?.let {
priorityMapping.forEach { (key, value) ->
if(key.equals(it, true)) {
return value
}
}
}
return 4 // default value
}
答案 2 :(得分:1)
正如其他答案所述,when
表达式使用equals
方法进行比较。 String
上的equals方法默认区分大小写。
如果要比较其equals
方法以外的对象,则可以使用equals
自己的实现创建一个小型包装器类。在您的特定情况下,这可能会有点矫kill过正,但在其他情况下,它可能会有用。
包装器类:
// In Kotlin 1.3, this class could probably be inlined.
class CaseInsensitiveString(val s: String) {
fun equals(other: Any) =
(other as? CaseInsensitiveString)?.s?.equals(s, ignoreCase = true) ?: false
// Overriding hashCode() just so it's consistent with the equals method.
override fun hashCode() = s.toLowerCase().hashCode()
}
包装String
的便捷扩展属性:
val String.caseInsensitive
get() = CaseInsensitiveString(this)
现在您可以执行以下操作:
fun getPriority(groupValue: String?): Int {
when (groupValue?.caseInsensitive) {
"one".caseInsensitive -> return 10
"Two".caseInsensitive -> return 9
"THREE".caseInsensitive -> return 8
else -> return 4
}
}
答案 3 :(得分:0)
正如其他人已经指出的那样,如果将标量(或标量列表)放在when
前面,则equals
使用->
形成布尔表达式。因此(官方docs of when的摘录-禁止发表评论)
when (x) {
1 -> print("x == 1") /* same as x.equals(1) or x == 1 */
2 -> print("x == 2") /* same as x.equals(2) or x == 2 */
else -> { // Note the block
print("x is neither 1 nor 2")
}
}
参数
ignoreCase-true,在比较字符时忽略字符大小写。 默认情况下 犯错 e。
如果至少一个字符,则两个字符被视为相同的忽略大小写 以下是正确的:
- 两个字符相同(与==运算符相比)
- 将toUpperCase方法应用于每个字符会产生相同的结果
- 对每个字符应用toLowerCase方法会产生相同的结果
因此,在您情况下,groupValue.equals("one")
与groupValue.equals("one", ignoreCase = false)
相同,因此答案是肯定的。默认情况下,当您在when
上使用String
时,比较将考虑套管。