JavaRush /Java Blog /Random-IT /Smettila di scrivere cicli! I 10 migliori metodi migliori...

Smettila di scrivere cicli! I 10 migliori metodi migliori per lavorare con le raccolte di Java 8

Pubblicato nel gruppo Random-IT
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! Smettila di scrivere cicli!  I 10 migliori metodi migliori per lavorare con le raccolte di Java 8 - 1Ciao 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 lambda actionper 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 a filter.
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 metodo forEachfunziona 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 specificata key, 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 risultato valuedell'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 keyesiste 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é Mapnel 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 chiave key. 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.
  • MapSe la chiave keynon esiste nella tua , o valueper questa chiave è uguale , nullil metodo aggiunge .Mapkey-value
  • Se la chiave Keyesiste ed è lì, value != nullil metodo la modifica valuenel risultato dell'esecuzione della funzione passata remappingFunction.
  • Se remappingFunctionrestituisce null, keyviene 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 coppia Mapse 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 keycon 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 valuecon 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!
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION