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被滥用。用户黑盒实现自己的逻辑。不需要使用者直接滥用破坏自己的封装。