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}
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}
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
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.
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