• kotlin实践笔记


    1.声明一个属性的完整语法是

    var <propertyName>[: <PropertyType>] [= <property_initializer>]
        [<getter>]
        [<setter>]
    
    • 1
    • 2
    • 3

    初始器initializer、getter、setter都是可选的。如果PropertyType类型可以从初始器initializer、getter中推导出来,那么也是可以省略的。
    例如:

    var data1 = 1 // 类型 Int、默认 getter 和 setter
    var data2 : Int? //错误,没有初始化,需要显示初始化器
    
    • 1
    • 2

    只读属性用val关键字替代var,并且只读属性不能有setter。
    我们可以自定义访问器,如果定义了setter,那么每次给属性赋值时都会调用它。如果定义了getter,那么每次访问该属性时都会调用它。
    例如:

    val videoHeight: Int
        get() = mediaplayer?.videoHeight ?: 0
        
    var videoName: String
        get() = mediaplayer?.name ?: "video"
        set(value){
            filed = value
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Setter 的参数名默认是value,当然也可以改成自己喜欢的名字。
    Setter的field标识符叫做幕后字段,只在访问器中出现。

    2.延迟属性委托 by lazy
    Kotlin 提供by lazy的方式实现懒加载委托,也就是在data第一次使用的时候才开始加载。
    by lazy的方式,只用于val定义的属性。
    例如:

    val testData: String by lazy{
        println("initdata!")
        "hello"
    }
    
    fun main(){
        println(testData)
        println(testData)
    }
    
    //打印输出
    initdata!
    hello
    hello
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3.内置函数let、also、with、run、apply
    let是一个域作用函数,定义一个变量在一个特定的作用域范围内,避免写一些重复判空的操作
    例如:

    //不适用域函数
    mVarms?.function1()
    mVarms?.function2()
    mVarms?.function3()
    
    //使用域函数
    //使用it替代object对象去访问其公有的属性 & 方法
    mVarms?.let{
        it.function1()
        it.function2()
        it.function3()
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    also和let的用法一致,只是返回的时候,let是返回最后一行表达式结果,而also是返回的it执行后的变量
    例如:

    var result = mVarms?.let{
        it.function1()
        it.function2()
        it.function3()
        999
    }  //返回的结果是999赋值给result
    
    var result = mVarms?.also{
        it.function1()
        it.function2()
        it.function3()
        999
    }  //返回的是mVarms对象本身赋值给result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    with是用在需要多次调用对象属性或者方法的时候,可省去对象名称
    例如:

    val people = People("mike", 28)
    with(people){
        println("my name is $name, and i'm $age years old")
    }
    
    • 1
    • 2
    • 3
    • 4

    run是结合了let和with的用法,而apply则是结合了also和with的用法
    例如:

    val people = People("mike", 28)
    var result = people?.run{
        println("my name is $name, and i'm $age years old")
        999
    } //   返回999
    
    var result = people?.apply{
        println("my name is $name, and i'm $age years old")
        999
    } //   返回people
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    SocketTool V4.0 使用说明
    Linux中报错no space device解决思路
    动态内存管理
    虹科分享 | 软件供应链攻击如何工作?如何评估软件供应链安全?
    Flask 项目结构
    DPDK网卡RSS(receive side scaling)简介
    如何优雅的排空节点上的pod?云服务商是如何回收机器的?
    ArrayList扩容源码解析
    Open3D(C++) 三维点云边界提取
    零基础学习ESP8266
  • 原文地址:https://blog.csdn.net/yus201120/article/details/126935275