Penso che non sia necessario spiegare agli studenti JavaRush cosa sono le raccolte e a cosa servono. Tuttavia, dopo il rilascio dell'ottava versione, molte operazioni elementari, che in precedenza richiedevano 6-7 righe di codice, sono state semplificate al minimo. Senza ulteriori indugi, ecco le 10 migliori tecniche Java8 Collections Framework che ti faranno risparmiare un sacco di tempo e spazio! Ciao a tutti, amici! L'abitudine, come sai, è una seconda natura. E essendomi abituato a scrivere,
for (int i = 0; i <......)
non voglio affatto reimpararlo (soprattutto perché questo design è abbastanza semplice e comprensibile). Tuttavia, all'interno dei loop ripetiamo spesso le stesse operazioni elementari, della cui ripetizione vorremmo davvero eliminare. Con il rilascio di Java8, Oracle ha deciso di aiutarci in questo. Di seguito sono riportati i 10 migliori metodi di raccolta che ti faranno risparmiare un sacco di tempo e codice.
1. Iterable.forEach(azione Consumatore<? super T>)
Il nome parla da solo. Scorre la raccolta passata ed esegue un'espressione lambdaaction
per ogni elemento.
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 (predicato<? super E> filtro)
Niente di complicato neanche. Il metodo scorre la raccolta e rimuove gli elementi che corrispondono afilter
.
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 una riga rimuoviamo dall'elenco tutti i numeri maggiori di 5.
3. Map.forEach(azione BiConsumer<? super K, ? super V>)
Il metodoforEach
funziona non solo per le classi che implementano l'interfaccia Collection
, ma anche per 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 + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
4. Map.compute(tasto K,BiFunzione<? super K, ? super V, ? estende V> remappingFunction)
Sembra un po' più intimidatorio, ma in realtà è semplice, come tutti i precedenti. Per la chiave specificatakey
, questo metodo imposta il valore sul risultato della funzione remappingFunction
. Per esempio:
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 + ". Author: " + b));
books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
L'autore di " Java Philosophy " è decisamente fantastico! :)
5. Map.computeIfAbsent(tasto K, funzione<? super K, ? estende V> mappingFunction)
Il metodo aggiungerà un nuovo elemento alla Map , ma solo se l'elemento con la stessa chiave non è presente. Ad esso verrà assegnato il risultatovalue
dell'esecuzione della funzione mappingFunction
. Se esiste già un elemento con tale chiave, non verrà sovrascritto, ma rimarrà al suo posto. Torniamo ai nostri libri e proviamo un nuovo metodo:
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 + ". Author: " + b));
La nostra funzione mappingFunction
:
public static String getHarryPotterAuthor() {
return "Джоан Роулинг";
}
Ed ecco il nuovo libro:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин
6. Map.computeIfPresent(tasto K, BiFunzione<? super K, ? super V, ? estende V> remappingFunction)
Stesso principio di ,Map.compute()
ma tutti i calcoli verranno eseguiti solo se l'elemento con la chiave key
esiste già.
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 + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Quando la funzione è stata richiamata per la prima volta, non si sono verificati cambiamenti, perché Map
nel nostro non esiste alcun libro con il titolo "Eugene Onegin". Ma per la seconda volta il programma ha cambiato l'autore del libro “I fratelli Karamazov” in “Alexander Pushkin”. Conclusione:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
7. Map.getOrDefault(Chiave oggetto, V defaultValue)
Restituisce il valore corrispondente alla chiavekey
. Se tale chiave non esiste, restituisce il valore predefinito.
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);
Molto comodamente:
Неизвестный автор
8. Map.merge(chiave K, valore V, BiFunzione<? super V, ? super V, ? estende V> remappingFunction)
Non ho nemmeno provato a calcolare quante righe di codice ti farà risparmiare questo metodo.Map
Se la chiavekey
non esiste nella tua , ovalue
per questa chiave è uguale ,null
il metodo aggiunge .Map
key-value
- Se la chiave
Key
esiste ed è lì,value != null
il metodo la modificavalue
nel risultato dell'esecuzione della funzione passataremappingFunction
. - Se
remappingFunction
restituiscenull
,key
viene rimosso dalla raccolta.
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 + ". Author: " + b));
Conclusione:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*scusa Bruce*
9. Map.putIfAbsent(chiave K, valore V)
In precedenza, per aggiungere una coppiaMap
se non c'era, dovevi fare quanto segue:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
map.put("Властелин Колец", "Джон Толкин");
Ora tutto è diventato molto più semplice:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");
10. Map.replace e Map.replaceAll()
Ultimo della lista, ma non meno importante.Map.replace(K key, V newValue
— sostituisce il valore della chiave key
con newValue
, se tale chiave esiste. In caso contrario, non succede nulla. Map.replace(K key, V oldValue, V newValue)
- fa la stessa cosa, ma solo se il valore corrente key
è oldValue
. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
— sostituisce tutti i valori value
con il risultato dell'esecuzione della funzione function
. Per esempio:
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 + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
Non ha funzionato! Il valore attuale della chiave dei fratelli Karamazov è Fëdor Dostoevskij, non Bruce Eckel, quindi non è cambiato nulla.
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 + ". Author: " + b));
public static String getCoolWriter() {
return "Крутой писатель";
}
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
Modifica facilmente i valori dell'intera mappa senza costruzioni complesse! PS Abituarsi a qualcosa di nuovo è sempre difficile, ma questi cambiamenti fanno davvero bene. In ogni caso alcune parti del mio codice ora sono decisamente meno spaghetti di prima :) Se l'articolo ti è piaciuto e vorresti vederne di nuovi, non dimenticare di supportare l'autore nel concorso cliccando “Mi piace”, oppure meglio ancora, "Mi piace" :) Buona fortuna con i tuoi studi!
GO TO FULL VERSION