美文网首页
Kotlin - Lambda表达式的基础用法

Kotlin - Lambda表达式的基础用法

作者: dashingqi | 来源:发表于2020-08-04 19:36 被阅读0次
Android_Banner.jpg

简介

  • Lambda表达式以函数的实际参数或者返回值存在时,该函数被称为高阶函数
  • 当Lambda表达式被inline修饰时,该函数被称为内联函数
  • Lambda表达式是一个匿名函数,是对匿名函数的一种简化
  • 以上介绍是Lambda的使用方式,在后面会一一介绍的
Lambda与函数式编程
  • Lambda表达式是一个匿名函数,它是函数式编程的基础,所谓函数式编程实际就是一种编程范式,也就是如何编写程序的方法论。
  • 简单来说就是,Lambda表达式在编译的时候都会编译成一个匿名类

Lambda表达式与正常函数之间的区别

正常函数有如下4种返回值类型
  • 无参数无返回值
  • 无参数有返回值
  • 有参数无返回值
  • 有参数有返回值
Lambda表达式有2种返回值类型
  • 无参数有返回值
  • 有参数有返回值
无参数有返回值
  • 语法格式
{函数体}()
//比如
{println()}()

// 上述代码所示,在调用Lambda表达式时,只是在Lambda表达式后面添加了(),()就代表了调用该表达式。
// 当调用了Lambda表达式后便会执行表达式中的函数体
  • 测试代码
    /**
     * 这是一个测试lambda表达式的函数
     *  用来测试无参数有返回值的lambda表达式
     */
  private  fun lambdaTestOne() {
        { println("this is test one") }()
    }
    // 打印结果 -----> this is test one
有参数有返回值

有参数有返回值的Lambda表达式,需要指定参数名称以及参数类型,参数之间使用 “,”分隔,并且参数之间可以省略,函数体回指定校对。

  • 语法格式
{参数名:参数类型,参数名:参数类型 -> 函数体}
  • 测试代码
    /**
     * 这是用来测试lambda表达式 有参数有返回值的函数
     */
    private fun lambdaTestTwo() {
        val sum = { a: Int, b: Int -> a + b }(4, 5)
        println("sum === $sum")
    }
    //上述代码我们是直接调用了lambda表达式,我们可以在开发中将lambda表达式赋值给一个变量,通过变量来调用
    //代码改造
     /**
     * 我们将一个lambda表达式赋值给一个变量
     * 我们通过变量来调用lambda表达式
     */
    private fun lambdaTestThree() {
        val sum = { a: Int, b: Int -> a + b }
        println("totalSum === ${sum(10, 10)}")
    }
Lambda返回值的类型
  • 测试代码
/**
     * 这是测试lambda表达式的返回值类型的
     */
    private fun testLambdaReturnValue() {
        println("=========================")

        val result1 = {
            println("输出语句1"); "字符串"
        }()

        println("返回值:$result1")
        println("返回值类型:${result1.javaClass}")


        println("=========================")

        val result2 = {
            println("输出语句1");
            println("输出语句2");
            18
        }()

        println("返回值 $result2")
        println("返回值类型 ${result2.javaClass}")

        println("=========================")

        val result3 = {
            println("输出语句1")
            println("输出语句2")
            true
        }()

        println("返回值 $result3")
        println("返回值类型 ${result3.javaClass}")

    }
    
    //运行结果
    
2020-08-02 11:56:18.921 10408-10408/com.dashingqi.module.lambda I/System.out: =========================
2020-08-02 11:56:18.922 10408-10408/com.dashingqi.module.lambda I/System.out: 输出语句1
2020-08-02 11:56:18.922 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值:字符串
2020-08-02 11:56:18.922 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值类型:class java.lang.String
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: =========================
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 输出语句1
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 输出语句2
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值 18
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值类型 int
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: =========================
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 输出语句1
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 输出语句2
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值 true
2020-08-02 11:56:18.923 10408-10408/com.dashingqi.module.lambda I/System.out: 返回值类型 boolean
  • 可以看出来在调用lambda表达式时,不管方法体内语句执行多少条,返回值的类型和返回值都是由方法体中最后一条语句决定的
  • 对于有返回值的lambda表达式,在实际返回值之后编写语句会发生什么呢?
private fun testFour() {
        val result = { a: Int, b: Int ->
            a + b
            "我是int"
        }(5, 6)

        println("result ---> $result")
    }
    //上述代码中 我们定义了一个有参数有返回值的lambda表达式,只不过在实际的返回值后面我们编写一个语句
    // 打印这个result结果我们可以看到,这个lambda表达式的结果时方法体中最后一行的值
    
    
    //运行结果
    2020-08-02 12:06:37.567 11134-11134/com.dashingqi.module.lambda I/System.out: result ---> 我是int

相关文章

网友评论

      本文标题:Kotlin - Lambda表达式的基础用法

      本文链接:https://www.haomeiwen.com/subject/gjnprktx.html