gpt4 book ai didi

functional-programming - Kotlin 中的内存功能

转载 作者:IT老高 更新时间:2023-10-28 13:42:08 24 4
gpt4 key购买 nike

我有一个带有实例方法 buildHierarchyUncached 的现有类,其签名可以在下面找到。

private fun buildHierarchyUncached(date: LocalDate): Node { ... }

我想提供一个公共(public)函数 buildHiearchy,它是buildHierarchyUncached 的内存版本。我可以接近我想要的:

val buildHiearchy = Memoize<LocalDate, Node>({buildHierarchy(it)})

可以这样称呼:

hierarchyService.buildHiearchy(businessDate)

使用:

class Memoize<I, O>(val func: (I) -> O): (I) -> O{
val cache = hashMapOf<I, O>();
override fun invoke(p1: I): O {
return cache.getOrPut(p1, { func(p1) } )
}
}

我希望能够将 memoized 函数声明为函数而不是属性,这并不是什么大问题,尽管我认为它有助于提高可读性。像这样:

fun buildHierarchy(date: LocalDate): Node = Memoize<LocalDate, Node>({ buildHierarchyUncached(it)})

但无法编译:“类型不匹配。必需节点。找到 memoize。”

另外,为什么不编译?

val buildHiearchy = Memoize<LocalDate, Node>({(date) -> buildHierarchy(date)})

最佳答案

以下解决方案适用于单参数函数。如果要创建函数 bar 的缓存版本,只需像这样声明它:

val cachedBar = makeFunctionCache({ bar(it) })

实现将缓存存储在闭包中,因此您无需将其放入专用类中:

fun <X, R> makeFunctionCache(fn: (X) -> R): (X) -> R {
val cache: MutableMap<X, R> = HashMap()
return {
cache.getOrPut(it, { fn(it) })
}
}

关于functional-programming - Kotlin 中的内存功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com