kotlin知识点汇总
函数默认值
fun foo(a: Int = 0, b: String = "") {...}
遍历 map/list
for ((k, v) in map) {
print("$k = $v")//k,v 可以随便命名
}
使用 ranges
for (i in 1..100) { ... } // 闭区间: 包括100
for (i in 1 until 100) { ... } // 半开区间: 不包括100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }
if (x in 1..10) { ... }
for (i in 1..100) { ... }
for (i in 2..10) { ... }
懒属性(延迟加载)
val p: String by lazy {
// 生成string的值
}
kotlin单例模式
object Util{ //和java稍有不同, kotlin为我们自动创建了一个Util对象, 全局可以访问, 并且是线程安全的, 类似于饿汉式
val name = "Name"fun dp2px(){
}
}//kotlin中调用
Util.name Util.dp2px()// java中调用
Resource.INSTANCE.name; Util.INSTANCE.dp2px();//第一种 饿汉式
//java public class SingletonDemo { private static SingletonDemo instance=new SingletonDemo(); private SingletonDemo(){ } public static SingletonDemo getInstance(){ return instance; } } //kotlin object SingletonDemo第二种 双重锁判断机制
//java
public class SingletonDemo { private static SingletonDemo instance; private SingletonDemo() { } public static SingletonDemo getInstance() { if (instance == null) { synchronized (SingletonDemo.class) { if (instance == null) { instance = new SingletonDemo(); } } } return instance; } }//kotlin
class SingletonDemo private constructor() { companion object { val instance: SingletonDemo by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { SingletonDemo() } } }第三种 静态内部类式
//java
public class SingletonDemo { private static class SingletonHolder{ private static SingletonDemo instance=new SingletonDemo(); } private SingletonDemo(){ System.out.println("Singleton has loaded"); } public static SingletonDemo getInstance(){ return SingletonHolder.instance; } }//kotlin
class SingletonDemo private constructor() { companion object { val instance = SingletonHolder.holder } private object SingletonHolder { val holder= SingletonDemo() } }
如果不为空, 执行后面的代码
var name:String? = null name?.length //不报异常, 值为null var name:String? = "dict" name?.length //值为4
如果为空, 执行后面的代码
var name = null
name?: println("name为空了") // 和三元运算符不同
类型转换
class Student : Person() fun main(args: Array<String>) { test() } fun test(){ val person:Person = Student() //可以不加?, 但是类型不匹配时,报类型转换异常, 加?安全转换, 即使类型不匹配也不会报错, 而是返回null val student = person as? Student }
!!操作符 把可空类型赋值给非空类型时, 使用
var name:String? = "" var ename:String = "" ename = name!! //需要加!! 不然语法报错, 但是如何为空时, 报空指针异常
Kotlin系列之let、with、run、apply、also函数的使用
class LoginBean { var app_userid: String? = null var contract_guid: String? = null var center_guid: String? = null fun test(){ } fun test2(){ } } //let //伪代码, 要在Android环境中运行 val loginBean = LoginBean() val num = loginBean?.let { //如果为空则打括号内不执行, 最后一行结果作为返回值 mTextView1.text = it.app_userid mTextView2.text = it.contract_guid mTextView3.text = it.center_guid it.test2() it.test() 3 //返回值 } //with 使用场景, 对象名特别长, 可以简写 对象中的方法特别多也可以直接使用方法名 with(loginBean){//可能报空指针异常, println(this.app_userid) println(this.contract_guid) println(this.center_guid) test() test2() 5//返回值 } //run val num = loginBean?.run { println(this?.app_userid) println(this?.contract_guid) println(this?.center_guid) test() test() 3//返回值 } //apply loginBean?.apply {//返回值为调用者 println(app_userid) println(contract_guid) println(center_guid) test() test() }kotlin的apply函数优化 多级判空
mSectionMetaData?.apply{ //mSectionMetaData不为空的时候操作mSectionMetaData
}?.questionnaire?.apply{ //questionnaire不为空的时候操作questionnaire
}?.section?.apply{ //section不为空的时候操作section
}?.sectionArticle?.apply{ //sectionArticle不为空的时候操作sectionArticle
}
//alsologinBean?.also {//返回值为调用者本身 println(it.app_userid) println(it.contract_guid) println(it.center_guid) it.test() it.test2() }//takeIf和takeUnless takeIf条件为true返回本身, 为false返回null。takeUnless正好相反
var str:String = "christmas" val str2 = str.takeIf { false } println(str2) val str3 = str.takeUnless { true } println(str3)apply使用比较多, 集合了几乎所有的优点