2014-11-25 27 views
15

Ich habe gerade kürzlich eine Version von putIfAbsent (...) in java.util.Map gefunden, die Sie mit einer Art Factory-Methode versehen können, um ein Objekt zu instanziieren, wenn es nicht bereits vorhanden ist. Dies würde viel Code vereinfachen.Warum hat Java keine putIfAbsent-Methode (Schlüssel, Lieferant) in Map?

Hier ist meine modifizierte Schnittstelle:

import java.util.Map; 
import java.util.function.Supplier; 

/** 
* Extension of the Map Interface for a different approach on having putIfAbsent 
* 
* @author Martin Braun 
*/ 
public interface SupplierMap<K, V> extends Map<K, V> { 

    public default V putIfAbsent(K key, Supplier<V> supplier) { 
     V value = this.get(key); 
     if(value == null) { 
      this.put(key, value = supplier.get()); 
     } 
     return value; 
    } 

} 

Nun meine Frage: Gibt es eine andere (einfacher) Weg, dies zu tun, oder habe ich übersehen nur etwas in der Java-API?

+4

FWIW, ['Map # putIfAbsent'] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putIfAbsent-K-V-) wurde mit Java8 hinzugefügt. – fxm

+0

in Java 1.8 gibt es V PutIfAbsent (K-Schlüssel, V-Wert) –

+0

Ich weiß, aber es ermöglicht nur, ein Objekt anstelle einer Anbieter-Methode bereitzustellen. –

Antwort

17

Ist nicht computeIfAbsent, was Sie wollen?

Wenn der angegebene Schlüssel nicht bereits mit einem Wert assoziiert ist (oder abzubildenden null), versucht, seinen Wert zu berechnen, die gegebene Zuordnung Funktion und trägt sie in dieser Karte, wenn nicht null.

Implementierung ist so etwas wie:

if (map.get(key) == null) { 
    V newValue = mappingFunction.apply(key); 
    if (newValue != null) { 
     map.put(key, newValue); 
    } 
} 

So ist es nicht gerade die Supplier<V> Signatur, die Sie geschrieben haben, aber in der Nähe, dass. Ein Schlüssel als Argument in der Mapping-Funktion ist definitiv sinnvoll.

+0

Ah. Ich habe das übersehen. Danke :) –

+0

Ja. Der Schlüssel als Argument macht mehr Sinn, das stimmt. Ich werde diese Antwort so schnell wie möglich annehmen. –

+0

Jede Lösung für Java 7 Benutzer? – shlatchz