【Kotlin】高阶函数用法一(with,run,apply)

【Kotlin】高阶函数用法(一)

  • 总结
  • with
  • run
  • apply
  • 简单应用

学而不思则罔,思而不学则殆

总结

函数 调用方法 提供环境 参数个数 返回值
with 直接调用 提供对象上下文 两个参数(对象+Lambda) 最后一行代码式作为返回值
run 对象调用 提供对象上下文 一个参数(Lambda) 最后一行代码式作为返回值
apply 对象调用 提供对象上下文 一个参数(Lambda) 无返回值

with

with接收两个参数:

  1. 第一个参数可以是任意类型
  2. 第二个参数是个lambda表达式
  3. 在表达式中可以直接用第一个参数的上下文,及调用相关方法
  4. lambda中最后一句是返回值
    val result = with(StringBuilder(), {
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//返回值
    })
    println(result)

    val result1 = with(StringBuilder()) {
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//返回值
    }
    println(result1)
class java.lang.String
start,One,Two,Three,Four,end
class java.lang.String
start,One,Two,Three,Four,end

run

  1. run不能直接调用
  2. 一定要调用某个对象的run函数才行
  3. run函数只接收一个Lamdba参数,并且会在Lamdba中提供调用对象的上下文
  4. 表达式中的最后一行代码作为函数的返回值
    val list = listOf<String>("One", "Two", "Three", "Four")

    val result = StringBuilder().run({
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//作为返回值
    })
    println(result)

    val result1 = StringBuilder().run {
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//作为返回值
    }
    println(result1)
class java.lang.String
start,One,Two,Three,Four,end
class java.lang.String
start,One,Two,Three,Four,end

apply

  1. apply不能直接调用
  2. 一定要调用某个对象的apply函数才行
  3. run函数只接收一个Lamdba参数,并且会在Lamdba中提供调用对象的上下文
  4. 没有返回值
    val list = listOf<String>("One", "Two", "Three", "Four")

    val result = StringBuilder().apply({
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//作为返回值
    })
    println(result.toString())

    val result1 = StringBuilder().apply {
        //lambda表达式中可以直接用StringBuilder()的方法
        append("start").append(",")
        list.forEach { append(it).append(",") }
        append("end")
        toString()//作为返回值
    }
    println(result1.toString())
class java.lang.StringBuilder
start,One,Two,Three,Four,end
class java.lang.StringBuilder
start,One,Two,Three,Four,end

简单应用

生成Intent

    fun test(one: String, two: String): Unit {
        val intent = Intent(this, MainActivity::class.java).apply {
            putExtra("one", one)
            putExtra("two", two)
        }
        startActivity(intent)
    }

你可能感兴趣的:(Kotlin)