kotlin中SAM使用场景

209 阅读1分钟

SAM(Single Abstract Method)转换(单一抽象方法转换)

是Kotlin和Java中简化代码机制。允许将一个函数接口(只有一个抽象方法的接口)实例用lambda表达式或函数引用来表示。 如java中的Runnable接口:

Runnable runnable = () -> System.out.println("Hello, World!");

kotlin中的fun interface也支持SAM转换

fun interface MyFunInterface {
    fun doSomething(input: String): Int
}

// 使用 SAM 转换
val myFun: MyFunInterface = { input -> input.length }

代码简洁、可读性高、减少样板代码(不需要匿名内部类)。

interface和fun interface

interface:普通接口 fun interface:函数接口

特性普通接口(interface)函数接口(fun interface)
抽象方法数量多个只能一个
默认方法支持支持
属性支持不支持
SAM转换不支持支持
Lambda表达式实现不支持支持
interface MyInterface{
    fun method1()
    fun method2()
    val property1:String
    val property2:String
    fun defaultMethod(){
        println("This is a default method1.")
    }
    val myFunction:MyFunction
    fun defaultMethod2(){
        println("This is a default method2.")
        myFunction.invoke()
        myFunction.defaultMethod2()
    }

}

fun interface MyFunction{
    /**
     * 抽象方法只能有一个
     */
    fun invoke()

    /**
     * 不支属性
     */
//    val property1:String
    fun defaultMethod(){
        println("This is a default method1.")
    }
    fun defaultMethod2(){
        println("This is a default method1.")
    }
}

interface ,sealed interface,sealed class

sealed:密封,所有子类必须在同一文件声明。 一般用户库的封装,不想让自己的库中的interface/class被滥用。用户黑盒实现自己的逻辑。不需要使用者直接滥用破坏自己的封装。