Im folgenden Kotlin Beispiel, würde Ich mag zu „memoize“ -Funktion das Element (das Ergebnis der Cache) matches
:memoization der Member-Funktion von Kotlin Datenklasse
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"))
}
Soweit ich sehen kann, Kotlin < = 1.1 unterstützt keine Memo-Erstellung. Natürlich können Sie Ihre eigene Memo-Funktion schreiben oder eine Bibliothek wie z.B.
Mit funKTionale muss ich keine eigene Memo-Funktion schreiben und kam zu dieser Lösung. Leider sieht es aus "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"))
}
Ich denke an eine schöneren Lösung wie
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?
}
Aber, wie diese zu erreichen?
Bedeutet memoization Caching-Ergebnis? – Joshua
@Joshua, ja. Danke für den Kommentar. Ich habe die Frage bearbeitet und "Zwischenergebnis cachen" hinzugefügt. – Peti