Kotlin 之内联函数的使用

360 阅读2分钟
  • let内联扩展函数

    作用与返回结果:
      1.定义变量在一个特定的作用域范围内;
      2.避免写一些判断null的操作
      3.返回结果为let作用域中的最后一行或指定return表达式
    
        fun letTest(str:String?){
            val result = str?.let{
                println("str:it") //it的作用于范围就是let大括号内
                1000
            }
            
            println(result)
        }
        
        fun void main(){
            letTest(null) //最终打印为null
            letTest("test") //打印出 str:test和1000
        }
    
  • with内联函数

    作用和返回结果:
        1.with它不是以扩展的形式存在的,它是将某个对象作为函数的参数,在函数块中this指代该对象
        2.返回值为函数块的最后一行或指定return表达式
    
        data class User(var name:String? = null)
        
        fun withTest(user:User){
            val result = with(user){
                println("my name is $name")
                1000
            }
            
            println(result)
        }
        
        fun main(){
            val user = User("test")
            withTest(user) //打印 my name is test 和 1000
        }
        
    
  • run内联扩展函数

    作用和返回结果
        1.run函数实际上可以说是let和with两个函数的集合体
        2.run函数只接受一个lambda函数为参数,以闭包形式返回
        3.返回值为最后一行的值或者指定的return的表达式
    
        data class User(var name:String? = "",var age:Int? = 10)
        
        fun main(){
            val list = listOf(User("张三",15),
                            User("李四",20),
                            User("lily"),
                            null)
                            
            list.forEach{
                it?.let{
                    with(it){
                        println("this is $name,age is $age")
                    }
                }
            }
            
            list.forEach{
                it?.run{
                    println("this is $name,age is $age")
                }
            }
        }
    
    
  • apply内联扩展函数

    作用和返回值
      1.apply与run函数很相似,唯一不同点就是他们各自返回的值不一样,run返回最后一行代码的值,二apply函数返回的是传入的对象的本身
    
        data class Person(var name:String?,var age:Int?)
        
        fun main(){
            val person = Person()
            person.apply{
                name="李四"
            }.apply{
                age = 50
            }
            
            println("this is ${person.name},age is ${person.age}") //最终打印为:this is 李四,age is 50
        }
    
  • also内联扩展函数

    作用和结果
      1.also和let的区别就是返回值不一样,let是以闭包的形式返回,返回函数体内最后一行的值,如果最后一行为空就返回一个Unit类型的默认值,而also函数返回的则是传入对象的本身
    
        fun main(){
            val result = "test".also{
                println(it.length)
            }
            
            println(result) //打印 4和test
        }
    

    总结

    • let适用于处理不为null的操作场景
    • with 适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中的onBindViewHolder,数据model的属性映射到UI上
    • run适用于let,with函数任何场景
    • apply适用于run函数的任何场景,一般用于初始化一个对象实例的时候,操作对象属性,并最终返回这个对象,如:动态infalte出一个XML的View的时候需要给View绑定数据会用到,多个扩展函数链式调用会用到,数据model多层级包裹判空处理的问题也会用到
    • also适用于let函数的任何场景,一般可用于多个扩展函数链式调用