Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 取代;如果;加上;什么时候;在科特林_Kotlin - Fatal编程技术网

Kotlin 取代;如果;加上;什么时候;在科特林

Kotlin 取代;如果;加上;什么时候;在科特林,kotlin,Kotlin,在kotlin中将if表达式转换为when表达式时遇到问题。我的If代码如下所示: fun main() { var cardPoints = 7_000 val cardLevel: String = if (cardPoints >= 0 && cardPoints < 1000) { "pearl" } else if (cardPoints >= 1000 && cardPoints <

在kotlin中将
if
表达式转换为
when
表达式时遇到问题。我的If代码如下所示:

fun main() {
    var cardPoints = 7_000


    val cardLevel: String = if (cardPoints >= 0 && cardPoints < 1000) {
        "pearl"
    } else if (cardPoints >= 1000 && cardPoints < 5_000) {
        "silver"
    } else if (cardPoints >= 5_000 && cardPoints < 10_000) {
        "gold"
    } else {
        "platinum"
    }

    val plural = if(cardPoints > 1 || cardPoints == 0) "s" else ""
    println("You have $cardPoints point$plural and are at the $cardLevel level.")
}
fun main(){
var cardPoints=7_000
val cardLevel:String=if(cardPoints>=0&&cardPoints<1000){
“珍珠”
}否则如果(卡点数>=1000和卡点数<5000){
“银色”
}否则如果(卡点数>=5_000和卡点数<10_000){
“黄金”
}否则{
“白金”
}
val复数=if(cardPoints>1 | | cardPoints==0)“s”else“
println(“您有$cardPoints point$复数,并且处于$cardLevel级别。”)
}
但是,我现在必须将其转换为“When”表达式(最好是在范围内),这是我到目前为止得到的:

fun main() {
    var cardPoints = 7_000

    val cardLevel: String = when {
        cardPoints >= 0 && cardPoints < 1000 -> "pearl"

        cardPoints >= 1000 && cardPoints < 5_000 -> "silver"

        cardPoints >= 5_000 && cardPoints < 10_000 -> "gold"
        else -> "platinum"

    }
    val plural = if(cardPoints > 1 || cardPoints == 0) "s" else ""
    println("You have $cardPoints point$plural and are at the $cardLevel level.")
}
fun main(){
var cardPoints=7_000
val cardLevel:字符串=何时{
cardPoints>=0&&cardPoints<1000->“pearl”
cardPoints>=1000&&cardPoints<5000->“银色”
cardPoints>=5_000&&cardPoints<10_000->黄金
else->“白金”
}
val复数=if(cardPoints>1 | | cardPoints==0)“s”else“
println(“您有$cardPoints point$复数,并且处于$cardLevel级别。”)
}
我不确定还有什么需要调整,或者我是否完全遗漏了什么。我将感谢任何帮助和建议。谢谢。

您可以在操作符中与
一起使用来解决此问题

var cardPoints = 7000
val cardLevel: String = when {
    cardPoints in 0..999 -> "pearl"

    cardPoints in 1000..4999 -> "silver"

    cardPoints in 5000..9999 -> "gold"

    else -> "platinum"

}
您可以与
中的
运算符一起使用来解决此问题

var cardPoints = 7000
val cardLevel: String = when {
    cardPoints in 0..999 -> "pearl"

    cardPoints in 1000..4999 -> "silver"

    cardPoints in 5000..9999 -> "gold"

    else -> "platinum"

}
你也可以使用

fun main () {
    var cardPoints = 7_000

    val cardLevel: String = when(cardPoints) {
        in 0..1000 -> "pearl"
        in 1000..5000 -> "silver"
        in 5000..10000 -> "gold"
        else -> "platinum"
    }

    val plural = if(cardPoints > 1 || cardPoints == 0) "s" else ""
    println("You have $cardPoints point$plural and are at the $cardLevel level.")
}
你也可以使用

fun main () {
    var cardPoints = 7_000

    val cardLevel: String = when(cardPoints) {
        in 0..1000 -> "pearl"
        in 1000..5000 -> "silver"
        in 5000..10000 -> "gold"
        else -> "platinum"
    }

    val plural = if(cardPoints > 1 || cardPoints == 0) "s" else ""
    println("You have $cardPoints point$plural and are at the $cardLevel level.")
}
一种更简单(也更有效)的方法:在
求值时,只需省略范围并利用的顺序:

什么时候{
cardPoints<0->错误(“这可能不应该是白金,对吧?”)
cardPoints<1000->“pearl”
积分<5000->银牌
信用卡积分<10000->“黄金”
else->“白金”
}
这当然也适用于
if
本身:

if(点数<0)错误(“不是白金,对吗?”)
否则,如果(点数<1000)“珍珠”
如果(积分<5000)“银牌”
如果分数<10000,则为“黄金”
“白金”
在这两种情况下,您不必重复前面一步已经计算过的内容,例如,如果它不低于0,则下一个条件不需要重复
=0
,因为我们已经知道它不是
<0
,并且在下一点只能是
=0
。如果不低于1000,则下一个条件不需要重复,即
>=1000
。如果愿意,您可以将每个
If(x)else If(!x&&y)
简化为
If(x)else If(y)

如果使用范围,请记住它会慢得多(在我的机器上,系数为~3-4),如果性能不是问题,当然可以忽略这一点

如果我认为
<0
不是白金是错误的,那么我可能也会在那里返回
“白金”
,而不是使用范围。

一种更简单(更有效)的方法:在
评估时,只需省略范围并利用
的顺序:

什么时候{
cardPoints<0->错误(“这可能不应该是白金,对吧?”)
cardPoints<1000->“pearl”
积分<5000->银牌
信用卡积分<10000->“黄金”
else->“白金”
}
这当然也适用于
if
本身:

if(点数<0)错误(“不是白金,对吗?”)
否则,如果(点数<1000)“珍珠”
如果(积分<5000)“银牌”
如果分数<10000,则为“黄金”
“白金”
在这两种情况下,您不必重复前面一步已经计算过的内容,例如,如果它不低于0,则下一个条件不需要重复
=0
,因为我们已经知道它不是
<0
,并且在下一点只能是
=0
。如果不低于1000,则下一个条件不需要重复,即
>=1000
。如果愿意,您可以将每个
If(x)else If(!x&&y)
简化为
If(x)else If(y)

如果使用范围,请记住它会慢得多(在我的机器上,系数为~3-4),如果性能不是问题,当然可以忽略这一点


如果我认为
<0
不是白金是错误的,那么我可能也会在那里返回
“白金”
,而不是使用范围。

但是范围应该以
999
4999
9999
结束,对吗?@tpschmidt你是对的。我修正了答案。谢谢。嗯,我尝试了在中使用此方法,但不幸的是,我收到了一个错误:未解决的引用:cardPoints?我从原始问题中提取了相关片段。在
when
表达式之前定义变量。它终于起作用了!感谢您的帮助:)我收到了上面提到的错误,因为范围的结尾已关闭。但是范围应该以
999
4999
9999
结尾,对吗?@tpschmidt您是对的。我修正了答案。谢谢。嗯,我尝试了在中使用此方法,但不幸的是,我收到了一个错误:未解决的引用:cardPoints?我从原始问题中提取了相关片段。在
when
表达式之前定义变量。它终于起作用了!感谢tpschmidt和@AndrejH的帮助:)我收到了上面提到的错误,因为范围的末尾已关闭。这不是一个答案,而是一个提示:如果您使用的是Android Studio或IntelliJ,则有一种自动方式,而不是手动转换。如果
,您可以将光标移动到
,按Alt+Enter并选择“用when替换if”。这种方式的好处是,它可以防止在手动转换代码时可能发生的错误。这不是一个答案,而是一个提示:如果您使用的是Android Studio或IntelliJ th,请不要手动转换