kotlin(一)
程序中的逻辑控制
kotlin中的条件语句主要有两种方式:if和when
kotlin的if语句相比于java有一个额外的功能,它是可以有返回值的,返回值就是if语句中每一个条件中国最后一行的代码的返回值
if:fun smallNumber(num1: Int, Num2: Int) = if (num1 > num2) num2 else num1
kotlin中的when和java的switch差不多,但是又比其强大得多
when语句允许从传入一个任意一个类型的参数,然后可以在when的结构体中定义一系列的条件,格式是:
匹配值 -> { 执行逻辑 }
当你的执行逻辑只有一行代码时,{}可以去掉
除了精确匹配以外,还包括类型匹配
注意:kotlin中判断字符串或对象是否相等可以直接使用==,而不需要像java中使用equals()方法
循环
kotlin提供了while和for循环关键字,其中while循环和java中while基本上没什么区别,重点是for。kotlin是for-in最常用,
..:闭区间
until:左闭右开
使用step关键字成为跳过某些循环元素的实例
面向对象编程
kotlin本着最简化的设计原则,将诸如new、行尾分号这种不必要的语法给取消掉了
如果一个类不是不是专门为继承而设计的,那么就应该加上final关键字声明,防止它被继承
kotlin将构造函数分成了两种,主构造函数和次构造函数,每个类都会有默认一个不带参数的主构造函数,虽然你也可以显示地给他指明参数,主构造函数的特点是没有函数体,直接定义在类名的后面即可
class Student(val sno: String, val name: String): Person() {
}
init结构体可以将所有主构造函数的逻辑写在里面。
当一个类既有主构造函数又有次构造函数时,所有的次构造函数必须调用主构造函数(包括间接调用)
可见性修饰符
java中的可见性修饰符:private,public,protected,default,
kotlin中的可见性修饰符:private,public,protected,internal
private差不多,public在kotlin中默认,default在java中默认,protected在java中时是对当前类、子类、和统一路径下的类可见,而kotlin则没有第三项,internal则是只对同一模块的类可见
data关键字:当一个类前面声明了data关键字时,就表明你希望这个类是一个数据类,kotlin会根据主构造函数中的参数帮你将equals(),hashcode(),toString()等固定且无实际逻辑意义的方法自动生成,另外当一个类中没有任何代码时,还可以将尾部的大括号省略。
lambda编程
我甚至认为lambda才是kotlin的灵魂所在
在kotlin中,不可变性方面控制地极其严格,像val和listOf,arrayOf均不可变
确实需要创建一个可变的集合时,使用MutableList
- 集合中的函数式API-map()函数是最常用的一种函数式API,它用于将集合中的每个元素都映射成一个另外的值,映射的规则需要用lambda表达式中指定,最终生成一个新的集合
- 集合中的函数式API-filter()函数也是一种比较常见的,用于对集合中的元素进行指定规则的过滤。另,函数式API们可以单独使用,也可以组合起来使用
- 集合中的函数式API-any()用来判断是否至少存在一个元素满足指定条件,
- 集合中的函数式API-all()用来判断集合中是否所有元素都满足指定条件。
- 其他的函数式API的用法,你看看文档就能掌握了
java函数式API的使用
限制条件:在kotlin代码中调用一个java方法,并且该方法接收一个java单抽象方法接口参数,就可以使用函数式API,java单抽象方法接口指的是接口中只有一个待实现方法,如果接口中拥有多个待实现方法,就无法使用函数式API
空指针检查
kotlin中默认所有的参数和变量都不可为空。借助判空辅助工具?.和?:
fun getTextLength(text: String) = text?.length ?: 0
如果我们想要强行通过编译,可以通过使用非空断言工具,写法是在对象后面添加!!
let函数是可以处理全局变量的判空问题的,而if判断语句则无法做到这一点,有一个原因是全局变量的值随时都有可能被其他线程所更新,即使做了判空处理,仍然无法保证if语句中的变量没有空指针风险
kotlin中的小魔术
字符串内嵌表达式
在activity或者fragment重构的时候,viewModel会自动保存之前的数据并给新的activity或fragment使用
lazy函数
lazy函数也可以用作函数式API,接受一个lambda表达式作为参数,返回一个lazy类型的实例,这个实力可以用作一个委托,实现延迟加载属性(lazy property):第一次调用get()时,将会执行lazy()函数受到的lambda表达式,然后会记住这次执行的结果,以后所有对get()的调用都会简单地返回以前记住的结果。
替换findviewbyid()
private fun Activity.bindView(@IdRes id: Int) lazy {
return lazy { findViewById(id) }

浙公网安备 33010602011771号