Kotlin学习之 5条件控制

刺骨的言语ヽ痛彻心扉 2022-05-27 10:11 234阅读 0赞

Kotlin条件控制

java中条件控制关键字有if和switch,但是Kotlin中没有switch,但是有in和when。

when和java中的switch有点类似的作用。

for和while是循环条件关键字,这里先介绍条件控制的。

一.IF 表达式

这个用法和java中是非常相似的。

1.一个 if 语句包含一个布尔表达式和一条或多条语句。

  1. //求最大值
  2. // 传统用法
  3. var max = a
  4. if (a < b) max = b
  5. // 使用 else
  6. var max: Int
  7. if (a > b) {
  8. max = a
  9. } else {
  10. max = b
  11. }
  12. // 作为表达式
  13. val max = if (a > b) a else b

注意Kotlin语句中没有分号;

我们也可以把 IF 表达式的结果赋值给一个变量。这个是Kotlin中独有的!

  1. val max = if (a > b) {
  2. print("Choose a")
  3. a
  4. } else {
  5. print("Choose b")
  6. b
  7. }

Kotlin不需要像Java那种有一个三元操作符,因为我们可以使用它来简单实现:

  1. val c = if (condition) a else b
  2. //Kotlin中
  3. val c = if (a>b) a else b
  4. //java中的代码示例:
  5. int c=(a>b)?a:b

我感觉Kotlin中的还麻烦一些!

2.Kotlin示例

  1. fun main(args: Array<String>) {
  2. var x = 0
  3. if(x>0){
  4. println("x 大于 0")
  5. }else if(x==0){
  6. println("x 等于 0")
  7. }else{
  8. println("x 小于 0")
  9. }
  10. var a = 1
  11. var b = 2
  12. val c = if (a>=b) a else b
  13. println("c 的值为 $c")
  14. }

打印结果:

  1. x 等于 0
  2. c 的值为 2

这个Kotlin中的if还是比较好理解的,毕竟和java非常相似。

二.使用区间 关键字:in

使用 in 运算符来检测某个数字是否在指定区间内,区间格式为 x..y
这个也是Kotlin种独有的!

1.实例

  1. fun main(args: Array<String>) {
  2. val x = 5
  3. val y = 9
  4. if (x in 1..8) {
  5. println("$x 在区间内")
  6. }
  7. if (y in 1..8) {
  8. println("$y 在区间内")
  9. }else{
  10. println("$y 不在区间内")
  11. }
  12. }

2.运行结果:

  1. 5 在区间内
  2. 9 不在区间内

in关键字虽然比较陌生,但是理解起来不难,看一次就能理解了。

三.When 表达式

when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。

when 既可以被当做表达式使用也可以被当做语句使用。
如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。

when 类似其他语言的 switch 操作符。其最简单的形式如下:

  1. //Kotlin中when的用法,有箭头->
  2. when (x) {
  3. 1 -> print("x == 1")
  4. 2 -> print("x == 2")
  5. else -> { // 注意这个块
  6. print("x 不是 1 ,也不是 2")
  7. }
  8. }
  9. //上面的语句在java中是这样的:
  10. switch(x){
  11. case 1:
  12. System.out.println("x==1");
  13. break;
  14. case 2:
  15. System.out.println("x==2");
  16. break;
  17. default:
  18. System.out.println("x 不是 1 ,也不是 2");
  19. }

在 when 中,else 同 java中switch 的 default。如果其他分支都不满足条件将会求值 else 分支。

如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:

  1. //判断是否等于0和1两种情况
  2. when (x) {
  3. 0, 1 -> print("x == 0 or x == 1")
  4. else -> print("otherwise")
  5. }

我们也可以检测一个值在(in)或者不在(!in)一个区间或者集合中:

  1. when (x) {
  2. in 1..10 -> print("$x is in the range")
  3. in 5..10 -> print("x is valid")
  4. !in 10..20 -> print("$x is outside the range")
  5. else -> print("none of the above")
  6. }
  7. //上面的语句用switch来表示就比较麻烦了,并且排除10到20也表示不出来
  8. //如果用if else还是可以表示出来的
  9. if(x>=1&&x<=10){
  10. System.out.print(x+" is in the range")
  11. }else if(x>=5&&x<=10){
  12. System.out.print(x+" is valid")
  13. }else if(x>=20||x<=10){
  14. System.out.print(x+" is outside in the range")
  15. }else{
  16. System.out.print("none of the above")
  17. }

上面符合第一个条件的时候,就不会继续下面一个in条件,
所以上面的语句如果x=5,那么输出结果是:5 is in the range ,后面的东西不会打印就像java中的break一样的。
如果x=12,那么输出结果是:none of the above

另一种可能性是检测一个值是(is)或者不是(!is)一个特定类型的值。

注意: 由于智能转换,你可以访问该类型的方法和属性而无需 任何额外的检测。

  1. //判断x是否是字符串类型,并且是否是字符串"prefix"开头
  2. fun hasPrefix(x: Any) = when(x) {
  3. is String -> x.startsWith("prefix")
  4. else -> false
  5. }

when 也可以用来取代 if-else if链。

如果不提供参数,所有的分支条件都是简单的布尔表达式,而当一个分支的条件为真时则执行该分支:

  1. when {
  2. x>100 -> print("x > 100")
  3. x>10 -> print("x > 10")
  4. else -> print("x is small")
  5. }
  6. //换成java的代码:
  7. if(x>100){
  8. System.out.println("x > 100");
  9. }else if(x>10){
  10. System.out.println("x > 100");
  11. }else{
  12. System.out.println("x is small");
  13. }

这种没有参数的when条件判断,并不局限于判断x的逻辑,也可以判断其他数据或关系

实例

  1. fun main(args: Array<String>) {
  2. var x = 0
  3. when (x) {
  4. 0, 1 -> println("x == 0 or x == 1")
  5. else -> println("otherwise")
  6. }
  7. when (x) {
  8. 1 -> println("x == 1")
  9. 2 -> println("x == 2")
  10. else -> { // 注意这个块
  11. println("x 不是 1 ,也不是 2")
  12. }
  13. }
  14. when (x) {
  15. in 0..10 -> println("x 在该区间范围内")
  16. else -> println("x 不在该区间范围内")
  17. }
  18. }

输出结果:

  1. x == 0 or x == 1
  2. x 不是 1 ,也不是 2
  3. x 在该区间范围内

when当表达式和语句的区别

上面说到when有两种作用:当表达式和当语句
如果它被当做表达式,符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。
上面大部分情况when都是用来当做语句,看下面两种情况的使用就知道他们的区别了

  1. package hello
  2. fun main(args: Array<String>) {
  3. var b=hasPrefix("prefix aa")//表达式返回的值
  4. println("b="+b)
  5. //when当做语句来使用
  6. var a=5
  7. when(a){
  8. in 1..10 ->println("a in 1-10")
  9. else ->println("a not in 1-10");
  10. }
  11. }
  12. //when当做表达式来使用
  13. fun hasPrefix(x: Any) = when(x) {
  14. is String -> x.startsWith("prefix")
  15. else -> false
  16. }

运行结果:

  1. b=true
  2. a in 1-10

when 中使用 in 运算符来判断集合内是否包含某实例:

  1. fun main(args: Array<String>) {
  2. val items = setOf("apple", "banana", "kiwi")
  3. when {
  4. "orange" in items -> println("juicy")
  5. "apple" in items -> println("apple is fine too")
  6. }
  7. }

输出结果:

  1. apple is fine too

到这里Kotlin中的条件控制语句就已经介绍完毕了,想要加深印象还是要自己多练习。

可以把上面的代码放到在线的测试页面中运行看看结果。

在线测试网址:http://www.runoob.com/try/runcode.php?filename=hello&type=kotlin

共勉:不管怎样时间都是会过去的

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读