kotlin进阶部分(一)

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

}


//also 

loginBean?.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使用比较多, 集合了几乎所有的优点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值