Kotlin的Lambda
Kotlin里的”高阶函数“:”参数or返回值为函数类型的函数“
Kotlin里的”高阶函数“只是个统称,没有任何特殊性,没有任何特殊功能
Kotlin里【函数并不能传递,传递的是对象】
Kotlin里【匿名函数和Lambda都是函数型对象】
Java中不允许函数当作参数,但可以通过接口实现类似功能(传递接口的对象,接口对象用不同的函数(这函数前提是实现了这个接口)实例化它)
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23//注:这是简化后的代码,不是View.java类的源码
public class View{
//...
OnClickListener mOnClickListener;
//...
public void onTouchEvent(MotionEvent e){
//...
mOnClickListener.onClick(this);
//...
}
//...
public interface OnClickListener{
void onClick(View v);
}
}
//调用的地方
view.setOnClickListener(new OnClickListener(){
public void onClick(View v){
doSomething();
}
});Kotlin中允许参数是函数类型的。
“
::
“ Function Reference。”::函数
“是个对象(函数类型的对象)。::
可理解成是个指向函数类型的对象的引用,不是指向函数本身。这个对象在代码中看不见,这个对象复制了原函数的功能。::函数
这个对象不是函数本身,是个和这个函数具有相同功能的对象。(能怎么用函数,就能怎么用这个对象)- 对
::函数
这个对象加括号、加参数,实际是调用这个对象的invoke()
函数
函数是一类,不是一个,即不同的参数列表、返回值类型,即不同的函数
要传一个函数类型的参数的写法
法1:用::
拿现成的函数来当作函数类型的对象,当参数传递
1 | //函数类型可以作为函数的参数类型 |
法2:把函数挪过来写
1 | fun a(funParam: (Int) -> String): String{ |
Kotlin中的匿名函数(Anonymous Function)不是函数,是对象!!!【函数型的对象】
1 | //java中写法 |
1 | val d = fun(param: Int): String{ |
- Kotlin的Lambda语法上不支持有返回值类型
- Kotlin的Lambda也是个函数类型的对象
Kotlin不支持用Lambda来简写匿名类对象的,因为有函数型参数了,所以这种单函数接口的写法从根本上就没必要了。但和Java交互时,是支持这种写法的
1 | //Java8: |
但kotlin中用接口这种折中的写法是错误的:
1 | interface KotlinListener{ |
总结:
Kotlin中存在一种在Java中不存在的,叫【函数类型】,这一类类型的对象在可以
- 当函数来使用
- 作为函数的参数
- 作为函数的返回值
- 赋值给变量
创建一个函数类型的对象有三种方式:
- 双冒号加函数名 【
::函数名
】 - 匿名函数
- Lambda
Kotlin中匿名函数、Lambda 本质 都是函数类型的对象
Kotlin的Lambda可以归类,它属于函数类型的对象