在以下科特林例如,我想「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