我想when()在Kotlin中使用一个表达式来从函数中返回不同的值.输入是a String,但它可能是可解析的Int,所以我想Int在可能的情况下返回解析,或者String如果不是,则返回.由于输入是一个String我不能使用是类型检查表达式.
有没有惯用的方法来实现这一目标?
编辑:我的问题是when()表达式应该是什么样子,而不是关于返回类型.
Wil*_*zel 14
版本1(使用toIntOrNull和when按要求时)
fun String.intOrString(): Any {
val v = toIntOrNull()
return when(v) {
null -> this
else -> v
}
}
"4".intOrString() // 4
"x".intOrString() // x
Run Code Online (Sandbox Code Playgroud)
版本2(使用toIntOrNull和elvis运算符?:)
正如s1m0nw1的评论中所建议的那样:when实际上并不是处理这个问题的最佳方法,我只是when因为你明确要求它而使用.这样更合适:
fun String.intOrString() = toIntOrNull() ?: this
Run Code Online (Sandbox Code Playgroud)
版本3(使用异常处理):
fun String.intOrString() = try { // returns Any
toInt()
} catch(e: NumberFormatException) {
this
}
Run Code Online (Sandbox Code Playgroud)
小智 9
使用 let 为一
fun isInteger(str: String?) = str?.toIntOrNull()?.let { true } ?: false
Run Code Online (Sandbox Code Playgroud)
简单直观
fun isNumeric(str: String) = str.all { it in '0'..'9' }
Run Code Online (Sandbox Code Playgroud)
正如 @coolMind 指出的,如果你想过滤 +/-
fun isNumeric(str: String): Boolean = str
.removePrefix("-")
.removePrefix("+")
.all { it in '0'..'9' }
Run Code Online (Sandbox Code Playgroud)
性能会类似
包中的toIntOrNull函数kotlin.text(in kotlin-stdlib)可能就是你要找的东西:
toIntOrNull
Run Code Online (Sandbox Code Playgroud)fun String.toIntOrNull(): Int? (source)平台和版本要求:Kotlin 1.1
将字符串解析为Int数并返回结果,如果字符串不是数字的有效表示,则返回null.
Run Code Online (Sandbox Code Playgroud)fun String.toIntOrNull(radix: Int): Int? (source)平台和版本要求:Kotlin 1.1
将字符串解析为Int数并返回结果,如果字符串不是数字的有效表示,则返回null.
更多信息:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-int-or-null.html
| 归档时间: |
|
| 查看次数: |
7952 次 |
| 最近记录: |