Warum nimmt Map.compute () eine BiFunction?

8

Ich verstehe nicht, warum Map.compute() und Map.computeIfPresent() take BiFunction -Parameter sowie Map.computeIfAbsent() a Function :

V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

Ich würde ein gewöhnliches Function<? super V, ? extends V> erwarten , den alten Wert einem neuen Wert zuordnen, resp. a Supplier<? extends V> für den neuen Wert. Der Anrufer hat bereits den Schlüssel (erstes Argument), so dass die Funktion oder der Lieferant ihn bereits nutzen kann. Alle Beispiele, die ich gefunden habe, benutzen den Schlüssel nicht. Die Gründe, die mir in den Sinn kommen:

  • Der Schlüssel muss (effektiv) sein final - das ist einfach zu verwalten
  • es gibt einige einfache und leicht zu verwendende Methodenreferenzen

Aber ich glaube nicht, dass dies tragfähige Gründe für dieses Design sind. Hast du irgendwelche Ideen?

    
steffen 09.12.2015, 15:52
quelle

1 Antwort

10

Sie sehen möglicherweise computeIfPresent als das Einzeleintrags-Pendant von replaceAll wobei letzterer den Schlüssel als Parameter benötigt, aber es ist natürlich, dieselbe Funktion als Eingabe für beide Operationen zu unterstützen und die API ist < em> konsistent hier: es liefert immer den Schlüssel als Parameter für die Funktion.

Im Allgemeinen erhöht die Bereitstellung des Schlüssels die Wiederverwendbarkeit bestehender Funktionen, sei es Methodenreferenzen oder gewöhnliche class -Implementierungen (d. h. Nicht-Lambda) der BiFunction -Schnittstelle. Diese Wiederverwendbarkeit kann jedoch auch die Leistung von Lambda-Ausdrücken bei der vorhandenen JRE-Implementierung beeinflussen:

Wie hier beschrieben können Lambda-Ausdrücke, die Werte aus dem umgebenden Kontext erfassen, in einzelnen Instanzen für jeden Erfassungsprozess enden. wohingegen Lambda-Ausdrücke, die nur ihre Parameter verwenden (nicht erfassende Lambdas), als Singleton-Instanz enden. Im Gegensatz dazu hat ein ansonsten unbenutzter Parameter keine Auswirkungen auf die Leistung. Aus diesem Grund ist es auch vorzuziehen, den Schlüssel als Parameter zu erhalten.

    
Holger 09.12.2015, 16:21
quelle

Tags und Links