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