SAMInJava.java(java中实现了只有一个接口当参数的类)
public class SAMInJava {
private ArrayList<Runnable> runnables = new ArrayList<Runnable>();
public void addTask(Runnable runnable) {
runnables.add(runnable);
System.out.println("添加:" + runnable + "任务之后,一共有" + runnables.size() + "个任务");
}
public void removeTask(Runnable runnable) {
runnables.remove(runnable);
System.out.println("删除:" + runnable + "任务之后,一共有" + runnables.size() + "个任务");
}
}
SAMInKotlin.kt(kotlin中实现了只有一个接口当参数的类)
/**
* kotlin本身不支持将只有runnable接口当参数的方法直接以lambda方式使用,
* 但使用typealias关键词给Runnable起别名之后(相当于() -> Unit就是Runnable),
* 就可以以lambda方式使用
*/
typealias Runnable = () -> Unit
class SAMInKotlin {
fun addTask(runnable: Runnable) {
}
}
SAMConversion.kt(调用以上java和kotlin类的方法)
/**
* kotlin与java互操作(SAM 转换)
* 1.SAM 是Single Abstract Method是缩写
* 2.SAM转换的条件:Java的接口,只有一个接口当参数的方法,可以使用lambda当参数
* 3.对于实现了kotlin实现的java接口,在java函数中定义该参数后,kotlin引用时可以用lambda表达式使用
* 4.由于java与kotlin表达式并不兼容,所以在每次添加lambda表达式是都不出同一个对象
*/
fun main(args: Array<String>) {
val samInJava = SAMInJava() //实例化java中的类
//lambda调用方法1:使用java中的带kotlin已支持的接口参数的方法,可以直接使用lambda表达式当参数
samInJava.addTask {
println("Hello")
}
val lambda = {
println("World")
}
//lambda调用方法2
samInJava.addTask(lambda)
samInJava.addTask(lambda)
samInJava.addTask(lambda)
samInJava.addTask(lambda)
samInJava.removeTask(lambda)
samInJava.removeTask(lambda)
samInJava.removeTask(lambda)
samInJava.removeTask(lambda)
val samInKotlin = SAMInKotlin() //实例化kotlin中的类
//以lambda表达式使用kotlin中的方法
samInKotlin.addTask {
println("haha")
}
}
SAMConversion.kt运行结果
SamMain.java(调用kotlin中的类的方法)
public class SamMain {
public static void main(String[] args) {
SAMInKotlin samInKotlin = new SAMInKotlin();
samInKotlin.addTask(new Function0<Unit>() {
@Override
public Unit invoke() {
return null;
}
});
}
}