Java函数式API的使用

1
2
3
public interface OnClickListener{
void onClick(View v);
}

这种接口被称为函数式接口,或者 SAM 接口, SAM 代表单抽象方法。

使用函数式接口的前体

这里的前提是,使用kotlin去调用java方法,而且java方法是个单抽象接口方法,就可以直接使用函数式API
已知在kotlin中,有很多简单快捷的函数式API操作。例如:

1
2
3
val list = listOf("Apple","Banana","Orange","Grape","Watermelon")
val maxLengthFruit = list.maxBy{it.length}
println(maxLengthFruit)

而这个的前提就是kotlin中可以将函数作为一个参数传递出去。同样也可以使用lambda来简写函数式。
我们在这里说的是,如果JAVA是一个单抽象接口方法,我们在kotlin中调用该方法时,也可以很简单的去编写,例如下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//这是一个Android中常用的点击事件窗口。
public interface OnClickListener{
void onClick(View v);
}
//如果通过JAVA的方式编写
//在以下函数中,View中的一个内部接口OnClickListener被当场实现。并且重写方法
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View w){
//方法体
}
});
//而通过kotlin调用JAVA的话
button.setOnClickListener{
//方法体
}

可能你会疑惑,既然使用了kotin那么调用java应该不常用吧,但实际并不是这样,kotlin的核心之一就是与java的互操性,它可以在几乎所有地方,平等的替代java,因此也可以使用java巨大的生态库,这样使用java的函数式API的机会就会有很多。

!!!只有在kotlin调用java时才可以使用

详解函数式接口在kotlin中的使用

在java中的期望函数式接口的方法可以接受一个lambda函数作为实参。
同样能达到该效果的还可以用object显示继承该接口,并重写他的方法。

但是如果用object显示创建的话,他会每一次都创建一个使用新实例对象。而如果使用lambda的话,如果该lambda函数没有访问任何定义他的函数的局部变量,也就是没有访问外部变量,那么这个lambda函数就是可以在多次调用中重用的。

如果他访问了外部变量,那么每次也会去创建一个新实例作为参数传递进去。
使用lambda函数是因为他在底层为你完善了这个SAM实例。