SAMInJava.java(java中實(shí)現(xiàn)了只有一個(gè)接口當(dāng)參數(shù)的類)
public class SAMInJava {
private ArrayList<Runnable> runnables = new ArrayList<Runnable>();
public void addTask(Runnable runnable) {
runnables.add(runnable);
System.out.println("添加:" + runnable + "任務(wù)之后,一共有" + runnables.size() + "個(gè)任務(wù)");
}
public void removeTask(Runnable runnable) {
runnables.remove(runnable);
System.out.println("刪除:" + runnable + "任務(wù)之后,一共有" + runnables.size() + "個(gè)任務(wù)");
}
}
SAMInKotlin.kt(kotlin中實(shí)現(xiàn)了只有一個(gè)接口當(dāng)參數(shù)的類)
/**
* kotlin本身不支持將只有runnable接口當(dāng)參數(shù)的方法直接以lambda方式使用汛兜,
* 但使用typealias關(guān)鍵詞給Runnable起別名之后(相當(dāng)于() -> Unit就是Runnable),
* 就可以以lambda方式使用
*/
typealias Runnable = () -> Unit
class SAMInKotlin {
fun addTask(runnable: Runnable) {
}
}
SAMConversion.kt(調(diào)用以上java和kotlin類的方法)
/**
* kotlin與java互操作(SAM 轉(zhuǎn)換)
* 1.SAM 是Single Abstract Method是縮寫
* 2.SAM轉(zhuǎn)換的條件:Java的接口,只有一個(gè)接口當(dāng)參數(shù)的方法洒琢,可以使用lambda當(dāng)參數(shù)
* 3.對于實(shí)現(xiàn)了kotlin實(shí)現(xiàn)的java接口秽梅,在java函數(shù)中定義該參數(shù)后肩豁,kotlin引用時(shí)可以用lambda表達(dá)式使用
* 4.由于java與kotlin表達(dá)式并不兼容箩艺,所以在每次添加lambda表達(dá)式是都不出同一個(gè)對象
*/
fun main(args: Array<String>) {
val samInJava = SAMInJava() //實(shí)例化java中的類
//lambda調(diào)用方法1:使用java中的帶kotlin已支持的接口參數(shù)的方法眯分,可以直接使用lambda表達(dá)式當(dāng)參數(shù)
samInJava.addTask {
println("Hello")
}
val lambda = {
println("World")
}
//lambda調(diào)用方法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() //實(shí)例化kotlin中的類
//以lambda表達(dá)式使用kotlin中的方法
samInKotlin.addTask {
println("haha")
}
}
SamMain.java(調(diào)用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;
}
});
}
}