Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我要在Kotlin中将函数类型实现为接口_Kotlin_Interface_Kotlin Function Type - Fatal编程技术网

为什么我要在Kotlin中将函数类型实现为接口

为什么我要在Kotlin中将函数类型实现为接口,kotlin,interface,kotlin-function-type,Kotlin,Interface,Kotlin Function Type,我遇到了一些事情,一直在想你为什么要这样做 您可以通过简单的函数类型在Kotlin中实现接口: 但我为什么要这样做?为什么我要以这种方式添加接口?我认为只能添加一个函数,不能再添加更多。 或者,我可以用函数体实现函数,而不只是像普通接口中的函数头,这是一个优势吗?我认为在Java中,可以向带有函数体的接口添加默认方法。所以可能是这样的?编写一个只实现函数类型接口的类可能不是很有用;但是,编写一个可以用来代替函数的类可能会很有用 标准库中的一个示例是KProperty1接口。您可以编写如下代码:

我遇到了一些事情,一直在想你为什么要这样做

您可以通过简单的函数类型在Kotlin中实现接口:

但我为什么要这样做?为什么我要以这种方式添加接口?我认为只能添加一个函数,不能再添加更多。
或者,我可以用函数体实现函数,而不只是像普通接口中的函数头,这是一个优势吗?我认为在Java中,可以向带有函数体的接口添加默认方法。所以可能是这样的?

编写一个只实现函数类型接口的类可能不是很有用;但是,编写一个可以用来代替函数的类可能会很有用

标准库中的一个示例是
KProperty1
接口。您可以编写如下代码:

data class C(val id: Int, val name: String)
val objs = listOf(C(1, "name1"), C(2, "name2"), C(3, "name3"))
val ids = objs.map(C::id)

这里,
C::id
是类型为
KProperty1
的属性引用,它可以用作
List.map
的参数来代替lambda,因为
KProperty1
扩展了
(C)->Int
。但是,
KProperty1
除了作为函数传递外,还有许多其他用途。

作为类的函数可以有状态。例如,您可以存储最后一次调用,并将历史记录用作缓存:

class Divider : (Int, Int) -> Double {
    val history = mutableMapOf<Pair<Int, Int>, Double>()

    override fun invoke(numerator: Int, denominator: Int): Double {
        return history.computeIfAbsent(Pair(numerator, denominator)) {
            numerator.toDouble() / denominator.toDouble()
        }
    }
}

fun main() {
    val divider = Divider()
    println(divider(1,2))
    println(divider(2,3))
    println(divider.history)
}
类分隔符:(Int,Int)->Double{
val history=mutableMapOf()
覆盖乐趣调用(分子:Int,分母:Int):双精度{
返回历史.ComputeFabSent(成对(分子、分母)){
分子.toDouble()/分母.toDouble()
}
}
}
主要内容(){
val分隔符=分隔符()
println(分隔器(1,2))
println(分隔器(2,3))
println(分割器历史记录)
}

非常感谢您。但是我也可以使用(单例)对象来实现这一点?是的,您也可以使用对象/单例。如果从多个线程使用对象,请注意多线程问题。
class Divider : (Int, Int) -> Double {
    val history = mutableMapOf<Pair<Int, Int>, Double>()

    override fun invoke(numerator: Int, denominator: Int): Double {
        return history.computeIfAbsent(Pair(numerator, denominator)) {
            numerator.toDouble() / denominator.toDouble()
        }
    }
}

fun main() {
    val divider = Divider()
    println(divider(1,2))
    println(divider(2,3))
    println(divider.history)
}