java Lambda
1.Java 的lambda 表达式 是接口式函数。:
- 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
- 函数式接口可以被隐式转换为 lambda 表达式。 Lambda 表达式和方法引用(实际上也可认为是Lambda表达式)上。
如定义了一个函数式接口如下:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
}
那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
1.Kotlin 的lambda 表达式
- Kotlin 的Lambda 表达式 同样适用于 函数式接口,如Runnable ,OnClickListener
- Kotlin 的Lambda 表达式 必须通过{ } 来包裹不可省略
- 如果 Lambda 表达式 返回值不是 Unit 。那么默认最后一行 表达式的值就是Lambda 表达式的值
- 如果参数类型可以推导出出来,那么Lambda 表达式就可以省略参数类型
- 如果只有一个参数,可以用it 代替。
Kotlin 函数类型
函数类型。它只关心 有几个函数参数,参数的类型是什么,返回值的类型是什么。
所以格式是(XClass,YClass)-> ZClass 。这里的 。Kotlin 啥都可以省略,但是函数类型声明的时候的,这个格式是不可以缩水的 。至于为啥用 “ ->” 来代替: 表示返回值的类型,可能是想看起来更好分辨函数类型。
Kotlin中函数类型有三种实例化 方式:
- 通过函数名,可以通过 :: Name 或者 obj:: Name
- 匿名函数类型。
- Lambda 表达式。
fun get(i:Int):String{
return "${i*3}"
}
fun main(){
// Function1 接口 ,1 代表 只有一个参数 。这个是专门为java平台设计的 。
val func :Function1<Int,String> = { "预约 ${it*3}" }
// 使用匿名函数
val func2 = fun (i:Int):String{
return "预约 ${i*3}"
}
// 使用Lambda 表达式实例化
val func3 :(Int) -> String = {i:Int-> "预约 ${i*3}" }
// 使用Lambda 表达式实例化, 并省略函数类型
val func3_1 :(Int) -> String = {i-> "预约 ${i*3}" }
// 使用Lambda 表达式实例化
// 当只有 匿名函数只有 一个参数时,可以用 it 代替。
val func4 :(Int) -> String = { "预约 ${it*3}" }
// 使用带名称的函数
val func5:(Int) -> String = ::get
}
需要注意的是,以上的 Lambda 表达式 和 匿名函数 有一点是不同的 。Lambda 表达式
是一个表达式 ,它是有返回值的,默认返回最后一行 。如果需要中止 。需要使用 return @label
来返回