kotlin作用域函数/内联函数let,with,run,apply,also的使用

 判断空

省略

it/this

上下文对象返回值 
let itLambda result 
with thisLambda result 
runthisLambda result

=let + with

  可以省略this,也可以判断空

apply this上下文对象(自身)

val person1 = Person("tom")
Person(name = "洛城夜雨").apply {
        age = 26
        person1.age = 28
        city = "洛阳"
        print(person1)
}
可以省略this,但是用以混乱

also it

上下文对象(自身)

 

跟apply差不多,

好处是

1.函数内外的this含义一样。

    apply要写this@MainActivity

2.可以用it,也可以自定义上下文名称

Person(name = "汤姆").also { tom -> print(tom)

 }

      

在这里插入图片描述

函数使用场景

很多人接触到作用域函数的时候,最头疼的问题不是不会用,而是不知道如何选择合适的作用域函数。之所以出现这种情况,是因为其实作用域函数在多数情况下是可以互换的,因此官方文档也给我们推荐了各个函数常见的使用场景。

函数选择

栗子代码

package com.zy

val students = run {
    // 顶级初始化
    mutableListOf<Person>().apply {
        add(Person("Abel"))
        add(Person("Ben"))
        add(Person("Colin"))
        add(Person("Denny"))
        add(Person("Frank"))
    }
}

fun main() {
    // 链式调用
    students.apply {
        // 对象配置
        add(Person(name = "Cecil", city = "LuoYang"))
    }.filter {
        it.name.startsWith("C")
    }.also {
        // 附加操作
        println("名字以字母C开头的学生人数为${it.size}")
    }.forEach { person ->
        val separator = if (person.city == null) "\n" else ""
        print("name = ${person.name} $separator")
        person.city?.let {
            // 空检查
            print(", city = ${it.toLowerCase()}")
        }
    }
    println()
    students.last().let { lastStudent ->
        // 上下文对象以lastStudent为参数名,作为局部范围中的变量引入
        val name = if (lastStudent.name.length < 10) "[${lastStudent.name}]" else lastStudent.name
        println("列表中最后一个学生是:$name")
    }
    students.run {
        // 对象配置 + 结果运算
        add(Person(name = "Mark", city = "Boston"))
        "students.size = $size"
    }.also(::println)

    // 调用列表中最后一个学生的 sayHello 和 introduceYourself 方法
    with(students.last()){
        sayHello()
        introduceYourself()
    }
}

class Person(val name: String, var city: String? = null) {

    fun sayHello() {
        println("Hello everyone!")
    }

    fun introduceYourself() {
        println("My name is $name and I'm from $city.")
    }
}

 

参考

Kotlin スコープ関数 用途まとめ
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e#with

玩转kotlin的作用域函数
https://blog.csdn.net/lyzhou1107/article/details/100575097


kotlin常见函数let,with,run,apply,also的使用
https://blog.csdn.net/qq_15988951/article/details/104918297

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值