Kotlin小节(二)

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集合总结

Kotlin小节(二)_第1张图片

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支持的编程格式

 命令式编程

函数式编程

面向对象编程

你可能感兴趣的:(kotlin)