Wie funktioniert java.util.Karte getOrDefault() funktioniert?
Habe ich bemerkt, dass wenn ich die Karte.getOrDefault("key1", new Object()), auch wenn Objekt vorhanden ist, für key1
in der Karte, new Object()
erstellt. Obwohl es nicht von der Methode zurückgegeben, aber es trotzdem schafft. Zum Beispiel,
public class Empl {
private int id;
private String name;
public Empl(String name) {
//TODO Auto-generated constructor stub
System.out.println(name);
this.name = name;
}
@Override
public String toString() {
//TODO Auto-generated method stub
return name+id;
}
}
laufen folgende,
Map<String, Empl> map = new HashMap<String, Empl>();
Empl imp = new Empl("timon");
map.put("1", imp);
System.out.println(map.getOrDefault("1", new Empl("dumnba")));
gibt diese Ausgabe:
timon
dumnba
timon0
Sollte nicht das Standard-Objekt nur erstellt werden, wenn es nicht auf der Karte ? Was ist der Grund, wenn nicht ?
Hast du den Quellcode? (Ich denke, es gibt keinen Weg, der neue wird nicht ausgeführt, bevor der Anruf)
Übergeben Sie das Standard-Objekt in der getOrDefault Methode. Sie schaffen Sie sich selbst durch das schreiben
Übergeben Sie das Standard-Objekt in der getOrDefault Methode. Sie schaffen Sie sich selbst durch das schreiben
new Empl("dumnba")
.InformationsquelleAutor Manoj Suthar | 2017-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie könnte das der Fall sein? Dieser Aufruf:
ist äquivalent zu:
In anderen Worten, alle Argumente werden ausgewertet vor wird an die Methode übergeben.
Könnten Sie möglicherweise verwenden
computeIfAbsent
statt, aber das wird sich ändern, die anzeigen, wenn der Schlüssel nicht vorhanden war, das können Sie nicht wollen:InformationsquelleAutor Jon Skeet
Alle Argumente einer Funktion werden ausgewertet, bevor die Funktion ausgeführt wird. Java zu bewerten, muss
new Empl("dumnba")
so kann es passieren das Ergebnis ingetOrDefault
. Es kann nicht wissen, bevorgetOrDefault
heißt, dass eines der Argumente ist nicht erforderlich.Wenn Sie möchten, bieten einen Standard, der ist nicht berechnet, wenn erforderlich, die Sie verwenden können,
computeIfAbsent
. Für diese, übergeben Sie eine Funktion, und diese Funktion wird nur ausgeführt, wenn der default-Wert ist erforderlich.InformationsquelleAutor khelwood
Dies ist nicht, weil, wie die Karte implementiert ist, es ist, weil, wie Java funktioniert. Die runtime-interpreter hat, das Objekt zu erstellen (der
new Empl
Teil), bevor es tatsächlich die Methode aufrufen (diegetOrDefault
Teil).InformationsquelleAutor Yoni
Blick in die java-8-Implementierung:
den doc gibt:
wird es wieder der Standardwert ist nicht vorhanden in der Karte
Beispiel:
InformationsquelleAutor ΦXocę 웃 Пepeúpa ツ