Kotlin基础8

 Map的遍历:

 map.forEach {
        println("${it.key},${it.value}")
    }
    map.forEach { t, u ->
        println("$t,$u")
    }

map可变集合:

通过mutableMapof创建可变的Map
getOrPut 键值不存在,就添加并返回结果,否则就返回已有键对应的值

fun main() {
    val mutableMapOf = mutableMapOf("Jack" to 20, "Jason" to 18, "Jack" to 30)
    mutableMapOf += "Jimmy" to 30
    mutableMapOf.put("Jimmy", 31)
    mutableMapOf.getOrPut("Rouse"){18}
    println(mutableMapOf)
}

filed:

针对你定义的每一个属性,btlin都会产生一个field、一个getter、以及一个setter,field用来存储属性数据,你不能直接定义field,Kotlin会封装field,保护它里面的数据,只暴露给getter和setter使用。属性的getter方法决定你如何读取属性值,每个属性都有getter方法,setter方法决定你如何给属性赋值,所以只有可变属性才会有setter方法,尽管Kotlin会自动提供默认的getter和setter方法,但在需要控制如何读写属性数据时,你也可以自定义他们。

class Player {
    var name = "jack"
        get() = field.capitalize()
        set(value) {
            field = value.trim()
        }
}

fun main() {
    var p = Player ()
    println(p.name)
    p . name = "rose"
    println(p.name)
}

计算属性:

计算属性是通过一个覆盖的get或set运算符来定义,这时field就不需要了

 val rolledValue 
        get() = (1..6).shuffled().first()

如果一个类属性既可空又可变,那么引用它之前你必须保证它非空,一个办法是用also标准函数。

var words:String? = "hello"
    fun saySomething(){
        words ?. also {
            println("Hello ${it.toUpperCase()}")}

    }

初始化:

我们在Player类的定义头中定义一个主构造函数,使用临时变量为Player的各个属性提供初始值,在Kotlin中,为便于识别,临时变量 (包括仅引用一次的参数),通常都会以下划线开头的名字命名。

class Play(
    _name: String,
    _age: Int,
    _isNormal: Boolean
) {
    var name = _name
        get() = field.capitalize()
        set(value) {
            field = value.trim()
        }

    var age = _age
    get() = age.absoluteValue
    set(value) {
        field = age.absoluteValue
    }

    var isNormal = _isNormal

}

fun main() {
    val p = Play("Jack" , 20 , true)
}

主构造函数里定义属性:

class Play2(
    _name: String,
    _age: Int,
    _isNormal: Boolean
) {
    var name = _name
        get() = field.capitalize()
        set(value) {
            field = value.trim()
        }
}

fun main() {
    val p = Play2("Jack" , 20 , true)
}

次构造函数:(也可定义初始化代码逻辑)

class Play2(
    _name: String,
    _age: Int,
    _isNormal: Boolean
) {
    var name = _name
        get() = field.capitalize()
        set(value) {
            field = value.trim()
        }


    constructor(name:String):this(name,10,false)

    constructor(name:String,age:Int):this(name,10,false){
        this.name = name.toUpperCase()
    }
}

fun main() {
    val p = Play2("Jack" , 20 , true)
    val p2 = Play2("Rose")
    val p3 = Play2("Jack", 20)
}

默认参数:

class Play3(
    _name: String,
    var age: Int = 20,
    var isNormal: Boolean
) {
    var name = _name
        get() = field.capitalize()
        set(value) {
            field = value.trim()
        }


    constructor(name: String) : this(name, 10, false)

    constructor(name: String, age: Int) : this(name, 10, false) {
        this.name = name.toUpperCase()
    }
}

fun main() {
    Play3("Jack", isNormal = false)
}

初始化块:

初始化块可以设置变量或值,以及执行有效性检查,如检查传给某构造函数的值是否有效,初始化块代码会在构造类实例时执行

 init {
        require(age > 0 ){"Age must be positive"}
        require(name.isNotBlank()){"Play must have a name"}
    }

初始化顺序:

主构造函数里声明的属性
类级别的属性赋值
init初始化块里的属性赋值和函数调用
次构造函数里的属性赋值和函数调用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值