在以下科特林例如,我想“memoize的”(高速缓存的结果)的成员函数matches
:科特林数据类的成员函数的记忆化
import java.util.regex.Pattern
data class MyDataClass(val name: String = "John Doe",
val description: String = "Famous person") {
//TODO memoize this
fun matches(searchTerm: String): Boolean {
println("Calculating...")
return name.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
|| description.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
}
}
fun main(args: Array<String>) {
val myData = MyDataClass()
println(myData.matches("John"))
println(myData.matches("John"))
println(myData.matches("John"))
println(myData.matches("Famous"))
println(myData.matches("Famous"))
println(myData.matches("Famous"))
}
据我所看到的, Kotlin < = 1.1不支持记忆。当然,您可以编写自己的记忆功能或使用库https://github.com/MarioAriasC/funKTionale
使用funKTionale,我不必编写自己的memoization函数,来到这个解决方案。不幸的是,看起来 “boilerplatey”:
import org.funktionale.memoization.memoize
import java.util.regex.Pattern
data class MyMemoizedDataClassV1(val name: String = "John Doe",
val description: String = "Famous person") {
private val memoizedMatches: (String, String, String) -> Boolean =
{ name: String, description: String, searchTerm: String ->
println("Calculating...")
name.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
|| description.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
}.memoize()
fun matches(searchTerm: String): Boolean {
return memoizedMatches(name, description, searchTerm)
}
}
fun main(args: Array<String>) {
val myData = MyMemoizedDataClassV1()
println(myData.matches("John"))
println(myData.matches("John"))
println(myData.matches("John"))
println(myData.matches("Famous"))
println(myData.matches("Famous"))
println(myData.matches("Famous"))
}
我想一个更好看的解决方案像
data class MyDataClass(val name: String = "John Doe",
val description: String = "Famous person") {
fun matches(searchTerm: String): Boolean {
println("Calculating...")
return name.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
|| description.matches("(?i).*${Pattern.quote(searchTerm)}.*".toRegex())
}.memoize() //TODO how?
}
但是,如何实现这一目标?
记忆是指缓存结果吗? – Joshua
@Joshua,是的。感谢您的评论。我编辑了这个问题,并添加了“缓存结果”。 – Peti