Kotlin-Lambda编程-Java函数式API的使用
1、如果在Kotlin代码中调用了一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。
2、Java单抽象方法接口指的是接口中只有一个待实现方法,如果接口中有多个待实现方法,则无法使用函数式API。
3、Java原生API中有一个极为常见的单抽象方法接口——Runnable接口,这个接口中只有一个方法run()方法:
public interface Runnable{
void run();
}
3.1、Thread类的构造方法中接受了一个Runnable参数:
new Thread(new Runnable(){//创建了一个Runnable接口的匿名类实例,并将它传给了Thread类的构造方法,最后调用Thread类的start()方法执行这个线程
@override
public void run(){
System.out.println("Thread is running");
}
}).start();
3.2将以上代码翻译成Kotlin版本:
Thread(object: Runnable{//由于Kotlin完全舍弃了new关键字,因此创建匿名类实例的时候就不能再使用new了,而是改用了object关键字
override fun run(){
println("Thread is running")
}
}).start()
3.3、目前Thread类的构造方法是符合Java函数式API的使用条件的:
Thread(Runnable{//因为Runnable类中只有一个待实现方法,即使没有显式的重写run()方法,Kotlin也能自动明白Runnable后面的Lambda表达式就是要在run()方法中实现内容
println("Thread is running")
}).start()
3.4、如果一个Java方法的参数列表中有且仅有一个Java单抽象方法接口参数,可以将接口名进行省略:
Thread({
println("Thread is running")
}).start()
3.5、当Lambda表达式是方法的最后一个参数时,可以将Lambda表达式移到括号的外面,同时如果Lambda表达式还是方法的唯一一个参数,可以将方法的括号省略:
Thread{
println("Thread is running")
}.start()
4、因为Android SDK还是使用Java语言编写的,当我们在Kotlin中调用这些SDK接口时,会用到Java函数式API的写法。
5、Android中的点击事件:
button.setOnClickListener(new View.OnClickListener(){
@override
public void onCLick(View v){
}
});
用Kotlin代码实现同样的功能,可以用函数式API的写法:
button.setOnClickListener{
}