[Java] Map # Merge ist schwer zu verstehen.

Während jetzt

Obwohl Java 9 neulich veröffentlicht wurde, wagte ich es zu diesem Zeitpunkt, Java 8 zu lernen. Die Rundenverzögerung ist ebenfalls gut, aber die neuen Funktionen von Java 8 sind immer noch zu schön und beeindruckt. Sie können eine Reihe von leicht verständlichen Artikeln über die neuen Funktionen von Java 8 von Google finden, daher überlasse ich ihnen die gesamte Erklärung, aber hier habe ich sie nicht verstanden und es gibt keinen Artikel, der Map # Merge zu ausführlich erklärt Notieren Sie sich die Bewegung von.

Map#merge

In Java 7 und Java 8 wird in Java 7 und Java 8 der Vorgang "Überschreiben des Werts mit" CCC ", wenn der Schlüssel" key1 "in der Map vorhanden ist, und Hinzufügen des Werts" BBB "als neuen Schlüssel, wenn er nicht vorhanden ist" ausgeführt. Vergleichen wir, wie man schreibt.

Bis zu Java7 ("key1"Existiert)


Map<String, String> map = new HashMap<String, String>();
map.put("key1", "AAA");

System.out.println(map);

if (map.containsKey("key1")) {
	map.put("key1", "CCC");
} else {
	map.put("key1", "BBB");
}

System.out.println(map);

Ausführungsergebnis


{key1=AAA}
{key1=CCC}

Bis zu Java7 ("key1"Ist nicht vorhanden)


Map<String, String> map = new HashMap<String, String>();

System.out.println(map);

if (map.containsKey("key1")) {
	map.put("key1", "CCC");
} else {
	map.put("key1", "BBB");
}

System.out.println(map);

Ausführungsergebnis


{}
{key1=BBB}

Wenn Sie versuchen, Map # Merge zu verwenden, das in Java 8 hinzugefügt wurde, sieht es wie folgt aus. Wenn der im ersten Argument angegebene Schlüssel ("key1") in Map nicht vorhanden ist, wird der Wert des zweiten Arguments ("BBB") von diesem Schlüssel ("key1") eingegeben, und wenn der Schlüssel vorhanden ist, das dritte Argument Die Remapping-Funktion von wird ausgeführt.

Java8("key1"Existiert)


Map<String, String> map = new HashMap<String, String>();
map.put("key1", "AAA");

System.out.println(map);

map.merge("key1", "BBB", 
	(v1, v2) -> {
		return "CCC";
	});

System.out.println(map);

Ausführungsergebnis


{key1=AAA}
{key1=CCC}

Java8("key1"Ist nicht vorhanden)


Map<String, String> map = new HashMap<String, String>();

System.out.println(map);

map.merge("key1", "BBB", 
	(v1, v2) -> {
		return "CCC";
	});

System.out.println(map);

Ausführungsergebnis


{}
{key1=BBB}

Was sind die beiden Argumente?

Ich habe mich gefragt, welche zwei Argumente an die Remapping-Funktion übergeben werden, die aufgerufen wird, wenn der Schlüssel in der Map vorhanden ist. darüber. Die "v1" und "v2" im obigen Beispiel werden überhaupt nicht verwendet.

Lassen Sie uns also vorerst ausgeben, was übergeben wird.

Java8("key1"Existiert)


Map<String, String> map = new HashMap<String, String>();
map.put("key1", "AAA");

System.out.println(map);

map.merge("key1", "BBB", 
	(v1, v2) -> {
		Sytem.out.printf("v1:%s, v2:%s\n", v1, v2);
		return "CCC";
	});

System.out.println(map);

Ausführungsergebnis


{key1=AAA}
v1:AAA, v2:BBB
{key1=CCC}

ist geworden. Das heißt, wenn der Schlüssel "key1" vorhanden ist, werden der bereits vorhandene Wert (im Beispiel "AAA") und der Wert, der festgelegt werden soll, wenn er nicht vorhanden ist (im Beispiel "BBB"), an diese Funktion übergeben. Selbst wenn der "Wert, der festgelegt werden soll, wenn der Schlüssel nicht vorhanden ist" als Argument übergeben wird, wird er meiner Meinung nach selten verwendet, wenn der Schlüssel vorhanden ist. Das Übergeben dieses Werts kann für begrenzte Zwecke nützlich sein, z. B. wenn dieser Wert mit einem vorhandenen Wert (Zeichenfolge) verknüpft wird. Bei einem einfachen Ersatz wie diesem ist das Schreiben auf Java 7 leichter zu verstehen.

Übrigens kann eine einfache Verkettung realisiert werden, indem in der Remapping-Funktion "String :: concat" angegeben wird, wie unten gezeigt.

Einfache Verbindung ist damit in Ordnung!


Map<String, String> map = new HashMap<String, String>();

map.put("key1", "AAA");

System.out.println(map);

map.merge("key1", "BBB", String::concat);

System.out.println(map);

Ausführungsergebnis


{key1=AAA}
{key1=AAABBB}

Warum hast du dir Merge angesehen?

Dieses Mal habe ich das Verhalten von Map # merge im Detail untersucht. Neu in Java 8 ist, dass die Operation Map <String, List <String >> List einen Wert hinzufügt, wenn ein Schlüssel vorhanden ist. Ich fragte mich, ob ich es schlauer machen könnte. Insbesondere habe ich es wie folgt implementiert.

Java8


Map<String, List<String>> map = new HashMap<String, List<String>>();

map.put("key1", new ArrayList<String>(Arrays.asList("AAA")));
System.out.println(map);

//Wenn key1 existiert"CCC"Auflisten, wenn es nicht existiert"BBB"Fügen Sie eine Liste mit dem Element hinzu
map.merge("key1", new ArrayList<String>(Arrays.asList("BBB")),
		(v1, v2) -> {
	v1.add("CCC");
	return v1;
});

System.out.println(map);

Ausführungsergebnis


{key1=[AAA]}
{key1=[AAA, CCC]}

Vor Java 7 sieht es wie folgt aus.

Bis zu Java 7


Map<String, List<String>> map = new HashMap<String, List<String>>();

map.put("key1", new ArrayList<String>(Arrays.asList("AAA")));
System.out.println(map);

if (map.containsKey("key1")) {
	//Wenn key1 existiert"CCC"Auflisten
	map.get("key1").add("CCC");
} else {
	//Wenn key1 nicht existiert"BBB"Fügen Sie eine Liste mit dem Element hinzu
	map.put("key1", new ArrayList<String>(Arrays.asList("BBB")));
}

System.out.println(map);

Ausführungsergebnis


{key1=[AAA]}
{key1=[AAA, CCC]}

In diesem Beispiel ist keiner viel anders (; ^ ω ^) Mit Java 8 fühlte ich mich jedoch erfrischt, weil ich die if-else-Anweisung entfernen konnte.

Ist Map # Merge also nützlich, wenn Sie Änderungen an Werten vornehmen möchten, die bereits in Map vorhanden sind, oder wenn Sie Ihren Code übersichtlicher gestalten möchten? Letzteres ist auch der Grund für die Verwendung von Lambda-Ausdrücken und Streams, nicht nur für diese Methode.

Bonus

Wenn Sie in der Neuzuordnungsfunktion null zurückgeben, wird der Schlüssel gelöscht.

Versuchen Sie, den Schlüssel zu löschen


Map<String, String> map = new HashMap<String, String>();
map.put("key1", "AAA");

System.out.println(map);

map.merge("key1", "BBB", 
	(v1, v2) -> {
		return null;
	});

System.out.println(map);

Ausführungsergebnis


{key1=AAA}
{}

Lass uns ein bisschen mehr mit Java 8 spielen ^^

Recommended Posts

[Java] Map # Merge ist schwer zu verstehen.
[Java] Verwendung von Map
Verwendung von Java Map
Java-Thread locker zu verstehen
[Java] Code, der schwer zu bemerken, aber furchtbar langsam ist
[Java] Konvertiere 1 in N Liste in Karte
JAVA (Karte)
Java-Referenz zum Verständnis in der Abbildung
3 schwierige Punkte für Java Realm
Was ist java
Java-Kompilierungsfehler Zuordnung zur Codierung von Windows-31j nicht möglich
Was ist Java <>?
Was ist java
[Java] Kartenvergleich
[Java] Einführung in Java
Einführung in Java
[Java 8+] Karten zusammenführen
Verstehen Sie den Java-Konstruktor
Wenn der Schwebeflug von Eclipse schwer zu sehen ist
In der Abbildung verstandene Java-Klassen und -Instanzen
So schleifen Sie Java Map (für jede / erweiterte for-Anweisung)
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Verwendung von Map
Verwendung der Karte
[Java] Stream API / Map
[Java] Stellen Sie eine Verbindung zu MySQL her
Verstehen Sie Java 8 Lambda-Ausdrücke
Was ist Java-Kapselung?
Kotlins Verbesserungen an Java
Enum Reverse Map Java
Führen Sie Java Word-Dokumente zusammen
Von Java zu Ruby !!
Bidirektionale Java-Kartenbibliothek
Was ist Java-Technologie?
Was ist Java API-Java?
Einführung in den Java-Befehl
[Java] Was ist flatMap?
[Java] Was ist ArrayList?
Verwendung von Map
Listenverarbeitung zum Verstehen mit Bildern --java8 stream / javaslang --bonus
Road to Java Engineer Part2 Was für eine Sprache ist Java?
Für Java-Anfänger: Liste, Karte, Iterator / Array ... Wie konvertiere ich?
[Java] UTF-8 (mit Stückliste) wird in 0xFFFD (REPLACEMENT CHARACTER) konvertiert.