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()
}