Lambda表达式与FunctionalInterface

Kotlin语言中,使用Lambda表达式是司空见惯的,为了与Java8的FunctionalInterface兼容。 今天特意进行了测试。

1. 在Kotlin中创建Java8中定义的FunctionalInterface的实例
val consumer: Consumer<String> = Consumer {
    println(it)
}

上面Consumer可以想象成一个工厂方法。

2. 在Kotlin中创建Kotlin中定义的FunctionalInterface的实例
@FunctionalInterface
interface Named {
    fun getName(): String
}

第一种方法,利用匿名对象:

val named: Named = object : Named {
    override fun getName(): String = "hello, kotlin."
}

其实,这种写法也不够优雅。

可以使用一个名为Named的方法来创建这个接口的实例。

@FunctionalInterface
interface Named {
    fun getName(): String
}

fun Named(lambda: (Unit) -> String): Named = object : Named {
    override fun getName(): String = lambda.invoke(Unit)
}

之后,就可以利用Named方法创建Named方法的实例了。

val named = Named { "my-name" }

我的经验是,最好直接使用高阶函数,而不是把FunctionalInterface当做函数的参数。一定要使用FunctionalInterface时,加上一个同名工厂函数比较好。

results matching ""

    No results matching ""