Ich beginne lambda zu lernen, und ich verstehe nicht, warum Java-Karte hat:Karte getOrDefault VS getOrUseSupplier
getOrDefault(Object key, V defaultValue)
und nicht (Arbeits genau die gleichen, aber wenn der Wert nicht vorhanden ist, dann wird default aus genommen werden Lieferant):
getOrUseSupplier(Object key, Supplier<V> defaultValue)
adventages i zur Zeit der aktuellen Lösung sehen:
- default muss nicht eine endgültige/e sein ffectively Endwert
- sieht einfacher & keine Notwendigkeit, Lambda-Syntax
Disadventages zu wissen:
- Wenn bei der Verwendung von getOrDefault wir neue Objekterstellung setzen, wird es erstellt und weitergegeben werden immidietely GC (während Wenn Sie einen Lieferanten verwenden, wird dieser überhaupt nicht erstellt).
Ich würde gerne wissen, ob es noch mehr disadventages der Verwendung & mit getOrDefault ist eher als getOrUseSupplier. Könnten Sie mir sagen, auch wenn überall in Java-Bibliotheken gibt Methode ist wie folgt:
static <V> V getOrUseSupplier(Map<?, V> map, Object key, Supplier<V> supplier)
, den Wert von Karte zu nehmen versucht, und wenn nicht, dann nimmt vom Lieferanten Wert nicht vorhanden ist.
Im 'getOrUserSupplier' Fall Sie noch ein' Supplier' Objekt erstellen, das GCed sein muss. Die einzigen Kosten, die Sie gegenüber 'getOrDefault' sparen, ist das Ausführen von' V's Konstruktor (wenn das erhebliche Kosten verursacht). – sepp2k
Können Sie mir sagen, wie viel Speicher jedes Mal benötigt wird, um einen Lieferanten zu erstellen, wenn eine Methode aufgerufen wird? – user3009344
@ sepp2k Erzeugt es wirklich einen neuen Lieferanten? Soll es nicht zu einem statischen Methodenaufruf kompiliert werden, was bedeutet, dass nur eine Instanz des Lieferanten erstellt wird? – Kayaman