1、安全索引取值函数:getOrElse和getOrNull
getOrElse:如索引值存在,返回索引处数值;索引值不存在,返回lamada值
getOrNull:如索引值存在,返回索引处数值;索引值不存在,返回null
e.g.
var numList = listOf(10,20,30)
var num = numList.getOrElse(3) { "value not exist" }
println(num)
var data = numList.getOrNull(4) ?: 40
println(data)
2、listof和mutableListof创建list的区别
列表只读和你在定义列表变量时选择val或var关键字无关。如果修改变量声明,把当前的val改为var,那么改变的不过是可以给变量重新赋值一个新列表,而列表自身依然是只读的。
listof创建的list不可变。不能增删改,只能读。
mutableListof创建的list是可变list,支持增删改读。
e.g.
val list = mutableListOf(10,20,30)
list.add(40)
list.remove(20)
list.add(0,22)
list.removeAt(list.size-2)
list[0] = 33
//判断是否会越界
list.add(3,55)//不越界
list.add(4,66)//越界
3、mutator函数
修改list,增删改查函数
[ ],+=,+-,add,addAll,clear, removeIf
4、遍历集合:for循环、forEach循环、
for循环如下:
val list:List = listOf("flower","weed","tree")
//遍历list集合
for (value in list){
println(value)
}
forEach循环如下:
list.forEach { element -> println(element) }
forEachIndexed遍历元素同时输出索引值如下:
list.forEachIndexed{index,element -> println("index:$index,value:$element")}
list.forEachIndexed(action ={index,element -> println("index:$index,value:$element")})
4、从文件读取数据
//从文件读入信息
val menuList = File("data/info.txt").readText().split('\n')
menuList.forEachIndexed { index, element -> println("index:$index, element:$element") }
info.txt,文件内容如下:
rose
paeony
flower
5、解构
同时定义多个变量type, name, price并赋值,如下:
val(type,num)= listOf("1","2","3")
过滤掉某个数值,用下划线”_“,如下:
val(type,_,num) = listOf("1","2","3","4")
6、break表达式
break可以立刻跳出任何的循环和条件表达式。不让程序继续执行循环内接下来的语句。立刻从break处跳出。
9、kotlin集合总结
10、also函数——防范竞态条件
11、主构造函数、次构造函数和init函数的执行顺序
主构造函数优先执行,init函数次之,次构造函数优先级最低。
类属性,init方法,主、次构造函数的执行顺序如下:
(1) 主构造函数里声明的属性(name:String,var age:Int)。
(2) 类级别的属性赋值( var name = "www".also { println("name:"+it) })。
(3) init初始化块里的属性赋值和函数调用(var age = 88、println函数)。
(4) 次构造函数里的属性赋值和函数调用(var career = "developer"、println函数)。
需要说明的是,init初始化块和类级别的属性赋值(的顺序取决于定义的先后。如果init初始化块定义在类级别的属性赋值之前,那么它就比类级别的属性赋值早一步初始化。
示例如下:
class TestMain (name:String,var age:Int){
var name = "www".also { println("name:"+it) }
init {
var age = 88
println("init#age:"+age)
}
var home = "town".also { println(println("home:"+it)) }
constructor(name: String):this(name,age = 99){
var career = "developer"
println("constructor#career:"+career)
}
}
fun main(args:Array){
println(TestMain("ppp").age)
}
输出结果如下:
name:www
init#age:88
home:town
kotlin.Unit
constructor#career:developer
99
12、懒惰初始化
一般把属性初始化操作是耗时操作的变量,将改变量初始化设置成懒惰初始化。
kotlin 懒惰初始化变量,为什么是val类型?
Kotlin 的懒惰初始化变量只能是 val 类型,因为 var 类型的变量值可以改变,而懒惰初始化变量只能在第一次访问时被初始化,因此变量的值不能被改变,因此只能是 val 类型。
13、as关键字——强制类型转换
14、数据类
数据类可以应用解构定义多个变量。
定义数据类需要满足的三个条件:
(1)数据类必须至少带有一个参数的主构造函数
(2)数据类的主构造函数的参数必须是var或者val类型
(3)数据类不能使用abstract、open、sealed和inner修饰符
15、接口和抽象类
实现接口的类,必须实现接口的所有属性和函数。
实现接口的抽象类,不必实现接口的所有属性和函数。但是继承抽象类的子类,必须实现接口的所有属性和函数。
16、关键字in和out
17、函数式编程
包括三类:变换、过滤和合并
变换函数:map和flatmap
过滤函数:filter
合并函数:zip和fold
18、kotlin支持的编程格式
命令式编程
函数式编程
面向对象编程
函数式编程相对于面向对象编程的优势:
(1)累加变量(如employeeShirtSizes)都是隐式定义的,所以
可以少用状态变量。
(2)函数运算结果会自动赋值给累加变量,降低了代码出错的机会。
(3)执行新任务的函数很容易添加到函数调用链上,因为它们都兼容
Iterable类型。
19、序列——惰性集合
适用于大数据集合
列表和序列之间可以相互转化。
20、==和===的区别
==
比较值(类似于java
中的 equals
)===
比较地址