Kotlin杂谈
-
kotlin的参数匹配
因为在kotlin中没有swtich这个关键字但是在kotlin中有更加好用更加简洁的when() 记住kotlin的一个原则多表达式少语句when也不例外他也是一个表达式 会返回结果 when有两种用法 一个和Switch的用法类似 一个就是多分支用法相当于嵌入多个if-else
val id = 1 when(id){ 1-> println("111") 2-> println("222") 3-> println("333") } //这就是类似于Switch的用法了 当做一个语句进行判断并执行行为
val id = 1 val str = when(id){ 1-> "111" 2-> "222" 3-> "333" else -> "xixi" } println("str: $str") //when语句作为表达式时 返回值为分支的最后一个语句
-
注意一点的是 可以没有when后面的括号 分支条件可以直接写在箭头的左边
-
还有就是当when作为表达式的时候,必须要有else分支否则编译报错
val num = 10 when{ num >=10 -> println("num大于等于10") num <10 -> println("num小于10") } //这既是另一种用法将判断的条件写在了箭头的前面
-
当然还有一点就是可以在括号里定义变量并传给when,这么做是缩小作用域提高安全性
val str = when(val sum = 2){ 1-> "111" 2-> "222" 3-> "333" else -> "xixi" } //这样子sum的作用域只能在when的代码块里了
-
kotlin的集合
kotlin的集合实现很巧妙 并没有自己编写集合的类 而是映射的java的类 不过在映射的过程中加入了视图 这和那么MySQL里面那个视图很像 就是实例还是那个实例只是在编译层面限制了我们能调用的方法 换个说法就是kotlin帮我们把引用的可变性做了限制
看图吧:
-
就是这个意思我们的引用并没有直接操作那个实例 所以kotlin可以做一些操作来验证我们的行为是否合法
因此不要指望用不可变的视图来解决线程安全问题 这个实例本身是可变的所以如果有可变的视图来引用他的话那就完蛋了
val list = setOf<Int>(1, 2, 3, 4, 5) val muList: MutableSet<Int> = list as MutableSet<Int> println(list.toString()) muList += 8 println(muList === list) println(list.toString())
-
代码验证了这一点但是有一点我要说明list是不行的因为listof() 和 mutableListof() 的底层映射类是不一样的
val nums = listOf(1,2,3,4,5) val muNums = mutableListOf(1,2,3,4,5) println(nums.javaClass) println(muNums.javaClass) println("---------------") val set = setOf(1,2,3,4,5) val muSet = mutableSetOf(1,2,3,4,5) println(set.javaClass) println(muSet.javaClass)
-
看来kotlin还是尽可能做到了不变性 让底层映射的类不一样来实现 在class java.util.Arrays$ArrayList里面没有add方法
-
好了这就是列表了
-
然后就是set集合了这个和list基本一样没啥可说的 同样存在可变和不可变但是底层都是一样的
-
映射(map)
这个类也区分可变和不可变 他其他用法基本一致
-
kotlin特殊的两个元组
-
Pair 和 Triple
-
Pair可以用来放一对对象
-
Triple用来放三个对象
-
然后简单创建Pair的方式 由于中缀表达式的存在
val pair1 = "1" to 1 val pair2 = Pair("2",2) println(pair1::class) println(pair2::class) //输出 class kotlin.Pair class kotlin.Pair
-
今天的杂谈结束