Kotlin函数 ⑥ ( 函数参数为 Lambda 表达式 | Lambda 表达式作为参数的简略写法 | 唯一参数的简略写法 | 最后一个参数的简略写法 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin函数 ⑥ ( 函数参数为 Lambda 表达式 | Lambda 表达式作为参数的简略写法 | 唯一参数的简略写法 | 最后一个参数的简略写法 )相关的知识,希望对你有一定的参考价值。

文章目录





一、 函数参数为 Lambda 表达式



定义函数 时 , 函数的参数 可以是 函数类型的变量 ,

可以传递一个 匿名函数 作为 函数参数 ;

匿名函数 就是 Lambda 表达式 ;


代码示例 : 在下面的代码中 ,

  • 函数参数 :

studentDoSomething 函数的 第三个参数为 action: (String, Int) -> String ,

其参数类型为 (String, Int) -> String , 是一个 函数类型 ;

  • 函数类型变量 :

main 函数中 , 定义函数类型变量 actionFun , 之后 该变量会作为函数参数传递给函数 ,

同时使用了 匿名函数 , 为该函数类型变量 actionFun 赋值 ;

  • 匿名函数类型自动推断 :

在该 匿名函数中 , 使用了 自动类型推断 , 在函数体中的参数列表 ,

声明了 完整的 参数名:参数类型 , name: String, age: Int -> ;

  • 函数变量作函数参数 :

在最后 , 将 函数类型 变量 actionFun 传递给了 studentDoSomething 函数 , 作为其第三个参数使用 ;

fun main() 
    // 定义函数类型变量, 之后作为函数参数传递给函数
    val actionFun =  name: String, age: Int ->
        "student $name $age years old, say hello"
    

    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    studentDoSomething("Tom", 18, actionFun);


fun studentDoSomething(name: String, age: Int,
                       action: (String, Int) -> String) 
    val act = action(name, age);
    println(act)

执行结果 :

student Tom 18 years old, say hello





二、Lambda 表达式作为参数的简略写法



1、Lambda 表达式作为唯一参数的简略写法


如果 Lambda 表达式 作为 函数参数 , 并且 该参数是 唯一参数 , 那么 Lambda 表达式外面的圆括号可以省略 ;


代码示例 :

fun main() 
    // 调用 doSomething 函数, 传入 Lambda 表达式 / 匿名函数
    doSomething(
        "Hello World"
    )


fun doSomething(action: () -> String) 
    val act = action();
    println(act)

此时将鼠标移动到 Lambda 表达式 上 , 也就是匿名函数中 , 会提示

Lambda argument should be moved out of parentheses 
参数应该移出圆括号

Kotlin 建议我们移除 Lambda 表达式 外面的圆括号 ;


修改后的代码示例 :

fun main() 
    // 调用 doSomething 函数, 传入 Lambda 表达式 / 匿名函数
    doSomething 
        "Hello World"
    


fun doSomething(action: () -> String) 
    val act = action();
    println(act)

执行结果 :


2、Lambda 表达式作为最后一个参数的简略写法


如果 Lambda 表达式 作为 函数参数 , 并且 该参数是 若干参数的最后一个参数 , 那么 Lambda 表达式可以提到括号外面 ;


在上一个章节的如下代码 , 可以直接 将 匿名函数 作为函数参数进行传递 , 不必使用 函数类型 变量名作为参数 ,

fun main() 
    // 定义函数类型变量, 之后作为函数参数传递给函数
    val actionFun =  name: String, age: Int ->
        "student $name $age years old, say hello"
    

    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    studentDoSomething("Tom", 18, actionFun);

直接使用匿名函数作为函数参数 的效果 :

fun main() 
    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    studentDoSomething("Tom", 18,  name: String, age: Int ->
        "student $name $age years old, say hello"
    )

匿名函数 , 也就是 Lambda 表达式 作为最后一个参数 , 可以提取到括号外面 , 代码效果如下 :

fun main() 
    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    studentDoSomething("Tom", 18)  name: String, age: Int ->
        "student $name $age years old, say hello"
    


最终的简化后的代码示例 :

fun main() 
    // 调用 studentDoSomething 函数, 输入姓名, 年龄, 执行的操作
    studentDoSomething("Tom", 18)  name: String, age: Int ->
        "student $name $age years old, say hello"
    


fun studentDoSomething(name: String, age: Int,
                       action: (String, Int) -> String) 
    val act = action(name, age);
    println(act)

执行结果 :

student Tom 18 years old, say hello

以上是关于Kotlin函数 ⑥ ( 函数参数为 Lambda 表达式 | Lambda 表达式作为参数的简略写法 | 唯一参数的简略写法 | 最后一个参数的简略写法 )的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

Kotlin空安全 ⑥ ( 先决条件函数 | checkNotNull 函数 | require 函数 | requireNotNull 函数 | error 函数 | assert 函数 )

Kotlin函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )

kotlin方法传入lambda表达式参数并调用invoke什么意思

Kotlin之标准函数的学习讲解(withapply)

Kotlin标准库函数 ① ( apply 标准库函数 | let 标准库函数 )