小编Bra*_*son的帖子

记忆功能在Kotlin中

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

private fun buildHierarchyUncached(date: LocalDate): Node { ... }
Run Code Online (Sandbox Code Playgroud)

我想提供一个公共函数 buildHiearchy,它是buildHierarchyUncached的memoized版本.我可以接近我想要的东西:

val buildHiearchy = Memoize<LocalDate, Node>({buildHierarchy(it)})
Run Code Online (Sandbox Code Playgroud)

可以这样称为:

hierarchyService.buildHiearchy(businessDate)
Run Code Online (Sandbox Code Playgroud)

使用:

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) } )
  }
}
Run Code Online (Sandbox Code Playgroud)

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

fun buildHierarchy(date: LocalDate): Node = Memoize<LocalDate, Node>({ buildHierarchyUncached(it)})
Run Code Online (Sandbox Code Playgroud)

但是这不会编译:"类型不匹配.必需的节点.找到memoize."

另外,为什么不编译呢?

val buildHiearchy = Memoize<LocalDate, Node>({(date) -> buildHierarchy(date)})
Run Code Online (Sandbox Code Playgroud)

functional-programming kotlin

7
推荐指数
3
解决办法
2694
查看次数

标签 统计

functional-programming ×1

kotlin ×1