kotlin 函数式接口 Functional(SAM) interface

一个接口如果仅仅有一个抽象的方法,那么这个接口被称为函数式接口或者仅有又一个抽象方法的接口(Single Abstract Method (SAM) interfaced)。这个接口可以有几个非抽象的方法,但是仅仅只能有一个抽象的方法。

在Kotlin中要声明一个函数式接口,需要使用 fun来对接口进行修饰。

fun interface KRunnable {
    fun invoke()
}

SAM 转换

对于函数式接口,可以使用SAM转换,通过 lambda表达式使代码更加的简洁并且能够提高代码的可读性。

你可以使用lambda表达式,而不是手动创建函数式接口的实现类。通过SAM转换,Kotlin 可以将 lambda表达式转换为对应的函数式接口的实现。

举个例子,如下是一个Kotlin的函数式接口:

fun interface IntPredicate {
    fun accept(i: Int): Boolean
}

如果你不使用SAM转换,你需要写像下面这样的代码:

// Create an instance of a class
val isEven = object : IntPredicate {
    override fun accept(i: Int): Boolean {
        return i % 2 == 0
    }
}

使用Kotlin的SAM转换,你可以通过下面的代码等价替换上面的代码:

// Creating an instance using lambda
val isEven = IntPredicate { it % 2 == 0 }

一个简短的lambda表达式替换所有不必要的代码:

fun interface IntPredicate {
    fun accept(i: Int): Boolean
}

// Create an instance using lambda
val isEven = IntPredicate { it % 2 == 0 }

fun main() {
    println("7 is even? - ${isEven.accept(7)}")
}

你可能感兴趣的:(kotlin 函数式接口 Functional(SAM) interface)