Lambda表达式就是一个匿名函数,它是函数式编程的基础,所谓函数式编程实际上就是一种编程范式,即如何编写程序的方法论。函数式编程的思想是将计算机运算视为函数的计算,并且计算的函数可以接收函数作为输入参数或者当作返回值来使用。使用函数式编程可以减少代码的重复,提高程序的开发效率。
Lambda表达式相对于普通函数有些区别,普通函数有4种返回值类型,即无参数无返回值、无参数有返回值、有参数无返回值、有参数有返回值。而Lambda表达式只有两种返回值类型,即无参数有返回值、有参数有返回值。
1. 无参数有返回值
在定义无参数有返回值的Lambda表达式时,只需要将函数体写在“{}”
中,函数体可以是表达式或语句块,具体语法格式如下:
{函数体}
例
{println()}
上面这行代码就是声明一个无参数有返回值的Lambda表达式,相当于声明了一个函数。下面我们就来学习一下如何调用无参数有返回值的Lambda表达式。
无参数有返回值的Lambda表达式调用的语法格式如下:
{函数体}()
例
{println()}()
从上述代码可以看出,在调用Lambda表达式时,只是在Lambda表达式后添加了“()”,“()”就代表了调用该表达式。当Lambda表达式被调用之后便会执行表达式中的函数体。接下来我们通过一个简单的案例来进行Lambda表达式的调用,具体代码如下所示。
package com.coolcou.chapter06
fun main(args: Array<String>) {
{
println("Lambda 表达式无参数有返回值") // 这一行就是函数体
}()
}
运行结果:
Lambda表达式无参数有返回值
2. 有参数有返回值
在定义有参数有返回值的Lambda表达式时,需要指定参数名称以及参数类型,参数之间使用英文“,”
分隔,且参数类型可以省略,函数体会自动校对。Lambda表达式中的“->”
用于表示箭头,用于指定参数或数据的指向,具体语法格式如下:
{参数名:参数类型,参数名:参数类型…->函数体}
有参数有返回值的Lambda表达式与无参数有返回值的Lambda表达式调用方式基本类似,同样需要在表达式后方添加“()”,只不过“()”中需要填写函数的参数,有参数有返回值的Lambda表达式调用的语法格式如下:
{参数名:参数类型,参数名:参数类型 … -> 函数体}
接下来我们通过一个案例来进行演示,具体代码如下所示。
package com.coolcou.chapter06
fun main(args: Array<String>) {
val sum = {
a : Int,b : Int -> a + b
}(6,8)
print(sum)
}
运行结果:
14
在上述代码中,定义了一个函数,并将该函数赋值给变量sum。在该函数中声明了两个Int类型的变量a和b,函数体中执行a和b的是求和操作,“->”
后的a+b便是返回的结果。为了调用该函数,在函数体后方使用“(6,8)”
传递了两个实参6和8,最后将结果进行打印,输出运行结果14。
在上面代码中是在声明Lambda表达式之后直接就调用此函数,在开发中还可以将Lambda表达式赋值给一个变量,通过变量来直接调用。接下来我们来对上面代码进行修改,修改后的代码如下所示。
package com.coolcou.chapter06
fun main(args: Array<String>) {
var sum = {
a : Int,b : Int -> a + b
}
println(sum(6,8)) // 函数调用
}
运行结果:
14
Lambda表达式返回值
由于Lambda表达式所表示的函数都是有返回值的,但通过以上案例可知,Lambda表达式已经省略了返回值的类型和方法名,那么是如何来声明返回值的类型和返回值的呢?接下来我们通过一个案例来演示,具体代码如下所示。
package com.coolcou.chapter06
fun main(args: Array<String>) {
println("-------------------1----------------------")
val result1 = {
println(" 输出语句1");
" 字符串"
}()
println(" 返回值:$result1")
println(" 返回值类型:${result1.javaClass}")
println("-------------------2----------------------")
val result2 = {
println(" 输出语句1");
println(" 输出语句2");
18
}()
println(" 返回值:$result2")
println(" 返回值类型:${result2.javaClass}")
println("------------------3-----------------------")
val result3 = {
println(" 输出语句1");
println(" 输出语句2");
true
}()
println(" 返回值:$result3")
println(" 返回值类型:${result3.javaClass}")
}
运行结果:
-------------------1----------------------
输出语句1
返回值:字符串
返回值类型:class java.lang.String
-------------------2----------------------
输出语句1
输出语句2返回值:18
返回值类型:int
------------------3-----------------------
输出语句1
输出语句2
返回值:true
返回值类型:boolean
从运行结果可以看出,在每次调用Lambda表达式时,不管方法体里面的语句执行多少条,返回值的类型和返回值都是由方法体中最后一条语句决定的,因此在实际返回值后不要编写任何语句。
如果在实际返回值后编写语句会发生什么情况呢?接下来我们通过一个数字求和的案例来进行演示,具体代码如下所示。
package com.coolcou.chapter06
fun main(args: Array<String>) {
var sum = {
a :Int,b: Int -> a + b
" 我是酷客网"
}
println(sum(9,7))
}
运行结果:
我是酷客网
从运行结果可以看出,程序功能是求a与b两个数字之和,但是返回值却是“我是酷客网”,与预期不符,无法输出想要的结果,所以此处一定要记住,不要将不是返回值的语句放置在方法体的最后一条语句的位置。
酷客教程相关文章:
评论前必须登录!
注册