Java memoization-Methode
Stieß ich auf ein Interessantes problem und Frage mich, ob und wie könnte man das in Java:
Erstellen Sie eine Methode, die kann memoize jede Funktion/Methode . Die Methode hat die folgenden Argumente : die Methode/Funktion und argument(s) für Sie.
Lass Sie uns zum Beispiel sagen, dass ich diese Methode :
int addOne(int a) { return a + 1;}
und ich rufe meine memoization-Methode zwei mal mit den gleichen Argumenten : addOne und 5 zum Beispiel, der erste Anruf sollte tatsächlich rufen Sie die Methode addOne und das Ergebnis zurückgeben und speichern auch das Ergebnis für das angegebene argument. Das zweite mal, wenn ich es nennen sollte wissen, wurde dies genannt, die vor und schauen Sie einfach die Vorherige Antwort.
Meine Idee wäre, so etwas wie ein HashMap<Callable,HashMap<List<Objects>,Object>>
wo Sie speichern die bisherigen Antworten und schauen Sie Sie später auf.Ich denke, das lässt sich irgendwie erledigt mit lambda-Ausdrücke, aber ich bin nicht vertraut mit Ihnen.Ich bin mir nicht ganz sicher, wie Sie Sie schreiben, die diese Methode und würde schätzen etwas Hilfe.
Kann dies gemacht werden mit diesem Ansatz?
- möglich, Duplikat der Was sind die verschiedenen Techniken für memoization in Java?
- Blick in die Proxyfunktion Mechanismen mit Java. Sie können erstellen Sie einen proxy ein Objekt, das fängt die Methodenaufrufe, die Speicherung der return-Wert. Wenn Sie die Methode aufrufen mit den gleichen Argumenten wie einem früheren Aufruf, Sie würde das gleiche Ergebnis erhalten die zimmerreserviereung, ohne das aufrufen des zugrunde liegenden Methode. Spring caching macht das für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Java 8 kann man das so machen, dass:
Dies ist ein gutes tutorial. Es ist für jede Methode.
Aus dem tutorial:
Den Memoizer Klasse:
Benutzung der Klasse:
Ausgabe:
computeIfAbsent(key, function::apply)
ist funktional einfach mit der Funktion alscomputeIfAbsent(key, function)
. Außer letzteren schafft man weniger lambda-Instanz.Können Sie memoize jede Funktion, die mit Java 8 ist
MethodHandle
s und Lambda-Ausdrücke, wenn Sie bereit sind zu geben, geben Sicherheit auf die Parameter:Beispiel
Dies erstellt eine variable stelligkeit lambda, welches die Funktion und die ist fast so schnell wie der Aufruf der Funktion direkt (d.h., keine Reflexion passiert, innerhalb von
call(Object...args)
) nach der lambda-Ausdruck konstruiert, da wir mitMethodHandle.invoke()
stattMethod.invoke()
.Können Sie noch tun, ohne lambdas (ersetzen mit anonymen Klassen) und MethodHandles (ersetzen mit der Methode.aufrufen), aber es wird performance-Strafen, machen diese weniger attraktiv für performance-bewusste code.
Method
, und wurde einfach vergessen.? extends V
statt? Wenn Methode, eigentlich gibt etwas, das ist? super V
, dann ist es nicht wirklich eineargs -> V
lambda, und Gießen zurückgegebene Wert ist nicht sicher.