Java函数式API的使用
我们需要了解的是实际上在kotlin中调用Java方法时也可以使用函数式API,但是这是有一定限制的。具体来说,当我们再kotlin中调用一个Java方法,并且使用该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。Java中单抽象方法接口指的是接口中只有一个待实现方法。如果接口中有多个待实现方法,则是无法使用函数式API。
1.Java原生API中有一个最为常见的单抽象方法接口——Runnable接口
定义如下:
public interface Runnable{
void run();
}
我们需要知道的是对于任何一个Java方法,只要它接收了Runnable参数,就可以使用函数式API。需要注意的是Runnable接口主要还是结合线程一起使用的。
2.因此下面通过Java的线程类Thread举例:
new Thread(new Runnable(){
@Overrride
public void run(){
System.out.println("Thread is running");
}
}).start();
//注意这里使用了匿名类的写法。匿名类通常继承一个父类或实现一个接口。
//Java中可以实现一个类中包含另外一个类,且不需要提供任何的类名直接实例化。主要是用于在我们需要的时候创建一个对象来执行特定的任务,可以使代码更加简洁。匿名类是不能有名字的类,它们不能被引用,只能在创建时用new语句来声明它们
/*匿名类语法格式:
class outerClass {
// 定义一个匿名类
object1 = new Type(parameterList) {
// 匿名类代码
};
}
*/
3.将上述代码翻译为kotlin版本,写法如下:
fun main(){
Thread(object:Runnable{
override fun run(){
println("Thread is running")
}
}).start()
}
//kotlin中匿名类的写法与Java有一点区别。在kotlin中完全舍去了new关键字,因此创建匿名类的时候就不能再使用new了,而是改用了object关键字
4.因为Thread类的构造方法是符合Java函数式API 的使用条件的,所以我们可以对代码进行精简
fun main(){
Thread(Runnable{
println("Thread is running")
}).start()
}
//因为Runnable类中只有一个待实现方法,即使这里没有显式地重写run()方法,kotlin也能自动识别Runnable后面的Lambda表达式就是要在run()方法中实现的内容。
5.另外,当一个Java方法的参数列表中有且仅有一个Java单抽象方法接口参数时,还可以将接口名进行省略;与此同时和前面kotlin中函数式API的用法类似,当Lambda表达式是函数的最后一个参数的时候,可以将Lambda表达式移到方法括号的外面去。如果同时Lambda表达式还是方法的唯一一个参数,还可以将方法的括号直接省略,最终代码可以简化为如下形式:
fun main(){
Thread{
println("Thread is running")
}.start()
}