Kotlin学习笔记(五十七)SAM转换

SAMInJava.java(java中实现了只有一个接口当参数的类)

public class SAMInJava {
    private ArrayList runnables = new ArrayList();

    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) {
    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")
    }
}
Kotlin学习笔记(五十七)SAM转换_第1张图片
SAMConversion.kt运行结果

SamMain.java(调用kotlin中的类的方法)

public class SamMain {
    public static void main(String[] args) {
        SAMInKotlin samInKotlin = new SAMInKotlin();
        samInKotlin.addTask(new Function0() {
            @Override
            public Unit invoke() {
                return null;
            }
        });
    }
}

你可能感兴趣的:(Kotlin学习笔记(五十七)SAM转换)