Ich denke, es besteht keine Notwendigkeit, JavaRush-Studenten zu erklären, was Sammlungen sind und wozu sie dienen. Nach der Veröffentlichung der 8. Version wurden jedoch viele elementare Operationen, die zuvor 6-7 Codezeilen erforderten, auf ein Minimum vereinfacht. Hier sind ohne weiteres die 10 besten Java8 Collections Framework-Techniken, mit denen Sie jede Menge Zeit und Platz sparen! Hallo zusammen, Freunde! Wie Sie wissen, ist Gewohnheit eine zweite Natur. Und nachdem ich mich an das Schreiben gewöhnt habe,
for (int i = 0; i <......)
möchte ich es überhaupt nicht noch einmal lernen (zumal dieses Design recht einfach und verständlich ist). Allerdings wiederholen wir innerhalb von Schleifen oft die gleichen elementaren Operationen, deren Wiederholung wir am liebsten loswerden würden. Mit der Veröffentlichung von Java8 hat Oracle beschlossen, uns dabei zu helfen. Nachfolgend finden Sie die 10 besten Erfassungsmethoden, mit denen Sie eine Menge Zeit und Code sparen.
1. Iterable.forEach(Consumer<? super T> action)
Der Name spricht für sich. Durchläuft die übergebene Sammlung und führtaction
für jedes Element einen Lambda-Ausdruck aus.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7
2. Collection.removeIf(Predicate<? super E> filter)
Auch nichts Kompliziertes. Die Methode durchläuft die Sammlung und entfernt die Elemente, die übereinstimmenfilter
.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
numbers.forEach(s -> System.out.print(s + " "));
In einer Zeile entfernen wir alle Zahlen größer als 5 aus der Liste.
3. Map.forEach(BiConsumer<? super K, ? super V> Aktion)
Die MethodeforEach
funktioniert nicht nur für Klassen, die die Schnittstelle implementieren Collection
, sondern auch für Map
.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
4. Map.compute(K key,BiFunction<? super K, ? super V, ? erweitert V> remappingFunction)
Es sieht etwas einschüchternder aus, aber in Wirklichkeit ist es einfach, wie alle vorherigen. Für den angegebenen Schlüsselkey
setzt diese Methode den Wert auf das Ergebnis der Funktion remappingFunction
. Zum Beispiel:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
Der Autor von „ Java Philosophy “ ist auf jeden Fall cool! :)
5. Map.computeIfAbsent(K-Taste, Funktion<? super K, ? erweitert V>-MappingFunction)
Die Methode fügt Map ein neues Element hinzu , jedoch nur, wenn dort kein Element mit demselben Schlüssel vorhanden ist. Ihm wird das Ergebnisvalue
der Funktionsausführung zugewiesen mappingFunction
. Existiert bereits ein Element mit einem solchen Schlüssel, wird dieser nicht überschrieben, sondern bleibt bestehen. Kehren wir zu unseren Büchern zurück und probieren eine neue Methode aus:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Unsere Funktion mappingFunction
:
public static String getHarryPotterAuthor() {
return "Джоан Роулинг";
}
Und hier ist das neue Buch:
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Autor: Джоан Роулинг
Название книги: Властелин Колец. Autor: Джон Толкин
6. Map.computeIfPresent(K key, BiFunction<? super K, ? super V, ? erweitert V> remappingFunction)
Gleiches Prinzip wie ,Map.compute()
aber alle Berechnungen werden nur durchgeführt, wenn das Element mit dem Schlüssel key
bereits existiert.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Autor: " + b));
Beim ersten Aufruf der Funktion ergaben sich keine Änderungen, da Map
es bei uns kein Buch mit dem Titel „Eugen Onegin“ gibt. Doch zum zweiten Mal wechselte das Programm den Autor des Buches „Die Brüder Karamasow“ zu „Alexander Puschkin“. Abschluss:
_________________
Название книги: Братья Карамазовы. Autor: Федор Достоевский
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
_________________
Название книги: Братья Карамазовы. Autor: Александр Пушкин
Название книги: Философия Java. Autor: Брюс Эккель
Название книги: Преступление и наказание. Autor: Федор Достоевский
Название книги: Война и мир. Autor: Лев Толстой
Название книги: Властелин Колец. Autor: Джон Толкин
7. Map.getOrDefault(Objektschlüssel, V defaultValue)
Gibt den Wert zurück, der dem Schlüssel entsprichtkey
. Wenn ein solcher Schlüssel nicht vorhanden ist, wird der Standardwert zurückgegeben.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
Ganz bequem:
Неизвестный автор
8. Map.merge(K-Taste, V-Wert, BiFunction<? super V, ? super V, ? erweitert V> remappingFunction)
Ich habe nicht einmal versucht zu berechnen, wie viele Codezeilen Sie mit dieser Methode sparen.Map
Wenn der Schlüssel in Ihremkey
nicht existiert odervalue
für diesen Schlüssel gleich ist ,null
fügt die Methode hinzu .Map
key-value
- Wenn der Schlüssel
Key
existiert und vorhanden ist,value != null
ändert die Methode ihnvalue
in das Ergebnis der Ausführung der übergebenen FunktionremappingFunction
. - Wenn
remappingFunction
es zurückgegeben wirdnull
,key
wird es aus der Sammlung entfernt.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.merge("Философия Java", "Брюс Эккель", (a, b) -> b + " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
Abschluss:
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
*tut mir leid, Bruce*
9. Map.putIfAbsent(K-Taste, V-Wert)
Um ein Paar hinzuzufügen,Map
wenn es noch nicht vorhanden war, mussten Sie bisher Folgendes tun:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
map.put("Властелин Колец", "Джон Толкин");
Jetzt ist alles viel einfacher geworden:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");
10. Map.replace und Map.replaceAll()
Letzter auf der Liste, aber nicht zuletzt.Map.replace(K key, V newValue
– ersetzt den Schlüsselwert key
durch newValue
, falls ein solcher Schlüssel vorhanden ist. Wenn nicht, passiert nichts. Map.replace(K key, V oldValue, V newValue)
- macht das Gleiche, aber nur, wenn der aktuelle Wert key
ist oldValue
. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
– ersetzt alle Werte value
durch das Ergebnis der Funktionsausführung function
. Zum Beispiel:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
Название:Братья Карамазовы. Autor: Федор Достоевский
Название:Философия Java. Autor: Брюс Эккель
Название:Преступление и наказание. Autor: Федор Достоевский
Название:Война и мир. Autor: Лев Толстой
Название:Властелин Колец. Autor: Джон Толкин
Funktioniert nicht! Der aktuelle Wert des Schlüssels der Brüder Karamasow ist Fjodor Dostojewski, nicht Bruce Eckel, daher hat sich nichts geändert.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Autor: " + b));
public static String getCoolWriter() {
return "Крутой писатель";
}
Название:Братья Карамазовы. Autor: Крутой писатель
Название:Философия Java. Autor: Крутой писатель
Название:Преступление и наказание. Autor: Крутой писатель
Название:Война и мир. Autor: Крутой писатель
Название:Властелин Колец. Autor: Крутой писатель
Ändern Sie ganz einfach die Werte für die gesamte Karte ohne komplexe Konstruktionen! PS: Es ist immer schwierig, sich an etwas Neues zu gewöhnen, aber diese Veränderungen sind wirklich gut. Auf jeden Fall sind einige Teile meines Codes jetzt definitiv weniger spaghettiartig als zuvor :) Wenn Ihnen der Artikel gefallen hat und Sie gerne neue sehen möchten, vergessen Sie nicht, den Autor beim Wettbewerb zu unterstützen, indem Sie auf „Gefällt mir“ oder klicken Besser noch: „Gefällt mir“ :) Viel Glück beim Lernen!
GO TO FULL VERSION