Kotlin类与对象(四):函数式(SAM)接口
对于函数式接口,可以通过 lambda 表达式实现 SAM 转换,从而使代码更简洁、更有可读性。使用 lambda 表达式可以替代手动创建实现函数式接口的类。可以通过更短的 lambda 表达式替换所有不必要的代码。修饰符在 Kotlin 中声明一个函数式接口。可以使用 Java 接口上的 SAM 转换。例如,有这样一个 Kotlin 函数式接口。类型别名只能有一个成员,而函数式接口可以有。函数式
Kotlin类与对象
四、函数式(SAM)接口
Single Abstract Method
只有一个抽象方法的接口称为函数式接口或 SAM(单一抽象方法)接口。函数式接口可以有多个非抽象成员,但只能有一个抽象成员。
可以用 fun 修饰符在 Kotlin 中声明一个函数式接口。
fun interface KRunnable {
fun invoke()
}
1、SAM 转换
对于函数式接口,可以通过 lambda 表达式实现 SAM 转换,从而使代码更简洁、更有可读性。
使用 lambda 表达式可以替代手动创建实现函数式接口的类。
通过 SAM 转换, Kotlin 可以将其签名与接口的单个抽象方法的签名匹配的任何 lambda 表达式转换为实现该接口的类的实例。
例如,有这样一个 Kotlin 函数式接口
fun interface IntPredicate {
fun accept(i: Int): Boolean
}
如果不使用 SAM 转换,那么你需要像这样编写代码:
// 创建一个类的实例
val isEven = object : IntPredicate {
override fun accept(i: Int): Boolean {
return i % 2 == 0
}
}

通过利用 Kotlin 的 SAM 转换,可以改为以下等效代码:
// 通过 lambda 表达式创建一个实例
val isEven = IntPredicate { it % 2 == 0 }
可以通过更短的 lambda 表达式替换所有不必要的代码。
fun interface IntPredicate {
fun accept(i: Int): Boolean
}
val isEven = IntPredicate { it % 2 == 0 }
fun main() {
println("Is 7 even? - ${isEven.accept(7)}")
}
可以使用 Java 接口上的 SAM 转换。
2、函数式接口与类型别名比较
函数式接口和类型别名用途并不相同。类型别名只是现有类型的名称——它们不会创建新的类型,而函数式接口却会创建新类型。
类型别名只能有一个成员,而函数式接口可以有多个非抽象成员以及一个抽象成员。函数式接口还可以实现以及继承其他接口。
考虑到上述情况,函数式接口比类型别名更灵活并且提供了更多的功能。
更多推荐


所有评论(0)