
简介
- 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
网友评论