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)=== 比较地址

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: