kotlin值得系列4、变量,常量,表达式,运算符

201 阅读4分钟

本文是kotlin系列第4篇

  • 常量和变量
  • 分支表达式
  • 运算符与中缀表达式
  • Lambda表达式

本来应该放在前面讲的,但是先说也没关系。相对 比较 基础的东西。


一、常量和变量

我们知道,kotlin有变量和常量。

  • 变量用 var 表示,可重新赋值
  • 常量用 val 表示,赋值后不可修改

但是变量和常量,本身也是可以再进行分类的。

常量 val

  • 运行时常量(val):编译期不能确定它的值,代码中会保留变量对它的引用。
  • 编译期常量(const val):编译期就知道值,并且会把代码中所有对它的引用都替换成它的值。

var

const 只能修饰 val 不能修饰 var

常量这边,相对没什么特殊的。

二、分支表达式

  • if表达式
  • when表达式
  • try..catch..
  • 中缀表达式

if表达式

在kotlin中if语句不仅可以像java中那样来使用,还可以有返回值,所以我们可以直接接收一个if表达式的值

private const val SUPER_USER = 1
private const val COMM_USER = 2
fun main(args: Array<String>) {

    val userRoleId = if(args.isNotEmpty() && args[0]=="admin"){
        SUPER_USER
    }else{
        COMM_USER
    }
    println(userRoleId)
}

像上面这样,其中的变量userRoleId就可以直接声明成常量(val),如果在java中则不能这么做,需要声明一个 变量 userRoleId,然后再去走判断的逻辑,根据不同if分支逻辑赋值为相应的值。

when表达式

  • when表达式可以看成是java中switch的加强版,更加简单暴力且支持任意类型
  • when同if一样,也可以带返回值。(when类似java中switch,同样也可以作为表达式,每个分支最后一行作为表达式的返回值)
  • when表达式还检查条件提供的输入范围。 使用 .. (双点)运算符创建范围。 in运算符用于检查值是否属于某个范围。
fun main(ar

我们来对比一下,java的switch和 kotlin的when

// java
public static void main(String args[]) {
        int code = Integer.parseInt(args[0]);
        String rankName;

        switch (code) {
            case 0:
            case 1:
                rankName = "冠军";
                break;
            case 2:
                rankName = "亚军";
                break;
            case 3:
                rankName = "季军";
                break;
            default:
                rankName = "无";
        }
        System.out.println(rankName);
    }


// kotlin
fun main(args: Array<String>) {
    val code = Integer.parseInt(args[0])
    val rankName: String

    when (code) {
        0,1 -> rankName = "冠军"
        2 -> rankName = "亚军"
        3 -> rankName = "季军"
        else -> rankName = "无"
    }
    println(rankName)
}

.
返回值的例子

c = when(a){
    0 -> 5
    1 -> 10
    else -> 0
}

. when还可以将条件转移到分支

c = when{
    x is String -> x.length
    x == 1 -> 100
    else -> 0
}

try..catch..

try..catch..同样可以作为表达式

c = try {
    a/b
}catch (e:Exception){
    e.printStackTrace()
    0
}
  • when表达式还检查条件提供的输入范围
fun main(args: Array<String>){  
    var number = 7  
    when(number) {  
        in 1..5 -> println("Input is provided in the range 1 to 5")  
        in 6..10 -> println("Input is provided in the range 6 to 10")  
        else -> println("none of the above")  
    }  
}

三、运算符与中缀表达式

中缀这个东西,场景相对少

中缀表达式,用于只有一个参数的场景,用infix修饰的函数

  • 中缀表达式必须是扩展函数或方法
  • 中缀表达式只能有一个参数
  • 中缀表达式的参数不能有默认值(否则参数可能为空);
  • 中缀表达式的参数不能是可变参数(否则参数可能不止一个)。
class Book(val name:String){
     infix fun on(place:String){
         print("《$name》放到${place}上了!")
     }

     override fun toString(): String {
       return "我拥有《$name》这本书"
  }
}

fun main(args: Array<String>) {
    val myBook = Book("简爱")
    println(myBook)
    myBook on "桌子"
}

四、Lambda表达式

这个,就太多东西了。

在关于前2篇里面,有很多相关的内容。