Uklanjanje elemenata iz Java kolekcija
1. Pregled
U ovom brzom vodiču, razgovarat ćemo o četiri različita načina uklanjanja predmeta s Jave Zbirke koji odgovaraju određenim predikatima.
Prirodno ćemo pogledati i neka upozorenja.
2. Definiranje naše kolekcije
Prvo ćemo ilustrirati dva pristupa koja mutiraju izvornu strukturu podataka. Zatim ćemo razgovarati o dvije druge mogućnosti koje će umjesto uklanjanja predmeta stvoriti kopiju izvornika Kolekcija bez njih.
Upotrijebimo sljedeću kolekciju kroz naše primjere da pokažemo kako možemo postići isti rezultat koristeći različite metode:
Imena zbirki = novi ArrayList (); names.add ("Ivan"); names.add ("Ana"); imena.add ("Marija"); names.add ("Anthony"); names.add ("Oznaka");
3. Uklanjanje elemenata pomoću Iterator
Java Iterator omogućuje nam hodati i uklanjati svaki pojedinačni element unutar a Kolekcija.
Da bismo to učinili, prvo moramo dohvatiti iterator nad njegovim elementima pomoću iterator metoda. Nakon toga svaki element možemo posjetiti uz pomoć Sljedeći i uklonite ih pomoću ukloniti:
Iterator i = names.iterator (); while (i.hasNext ()) {String e = i.next (); if (e.startsWith ("A")) {i.remove (); }}
Unatoč svojoj jednostavnosti, valja uzeti u obzir nekoliko upozorenja:
- Ovisno o zbirci na koju bismo mogli naletjeti ConcurrentModificationException iznimke
- Moramo prelistati elemente prije nego što ih možemo ukloniti
- Ovisno o zbirci, ukloniti mogu se ponašati drugačije od očekivanog. Npr .: ArrayList.Iterator uklanja element iz zbirke i pomiče daljnje podatke ulijevo, dok, LinkedList.Iterator jednostavno podešava pokazivač na sljedeći element. Kao takav, LinkedList.Iterator izvodi mnogo bolje od ArrayList.Iterator prilikom uklanjanja predmeta
4. Java 8 i Collection.removeIf ()
Java 8 uvela je novu metodu u the Kolekcija sučelje koje pruža sažetiji način uklanjanja elemenata pomoću Predikat:
names.removeIf (e -> e.startsWith ("A"));
Važno je napomenuti da suprotno Iterator pristup, ukloniAko izvodi slično dobro u obje LinkedList i ArrayList.
U Javi 8, ArrayList nadjačava zadanu implementaciju - koja se oslanja na Iterator - i provodi drugačiju strategiju: prvo, prevlači elemente i označava one koji se podudaraju s našim Predikat; nakon toga, ponavlja se drugi put da ukloni (i pomakne) elemente koji su označeni u prvoj iteraciji.
5. Java 8 i uvod u Stream
Jedna od novih glavnih značajki Java 8 bila je dodavanje Stream (i Kolekcionari). Postoji mnogo načina za stvaranje a Stream iz izvora. Međutim, većina operacija koje utječu na Stream instanca neće mutirati svoj izvor, već se API fokusira na stvaranje kopija izvora i izvršavanje bilo koje radnje koja bi nam u njima trebala.
Pogledajmo kako se možemo koristiti Stream i Kolekcionari pronaći / filtrirati elemente koji se podudaraju i ne podudaraju s našim Predikat.
5.1. Uklanjanje elemenata pomoću Stream
Uklanjanje, ili bolje rečeno, filtriranje elemenata pomoću Stream je sasvim izravno, samo trebamo stvoriti instancu Stream koristeći naš Kolekcija, zazivati filtar s našim Predikat i onda prikupiti rezultat uz pomoć Kolekcionari:
Zbirka filteredCollection = imena .stream () .filter (e ->! E.startsWith ("A")) .collect (Collectors.toList ());
Strujanje je manje invazivan od prethodnih pristupa, potiče izolaciju i omogućuje stvaranje više kopija iz istog izvora. Međutim, trebali bismo imati na umu da to također povećava memoriju koju koristi naša aplikacija.
5.2. Kolekcionari.podjelaBy
Kombinirajući oboje Stream.filter i Kolekcionari je vrlo zgodan, iako možemo naići na scenarije u kojima su nam potrebni i podudarni i nepodudarajući elementi. U takvim slučajevima možemo iskoristiti Kolekcionari.podjelaBy:
Karta classicElements = imena .stream () .collect (Collectors.partitioningBy ((String e) ->! e.startsWith ("A"))); Podudaranje niza = String.join (",", ClassiElements.get (true)); String nonMatching = String.join (",", ClassiElements.get (false));
Ova metoda vraća a Karta koji sadrži samo dva ključa, pravi i lažno, svaki koji upućuje na popis koji sadrži odgovarajuće, odnosno nepodudarajuće elemente.
6. Zaključak
U ovom smo članku pogledali neke metode za uklanjanje elemenata iz Zbirke i neka njihova upozorenja.
Kompletni izvorni kod i sve isječke koda za ovaj članak možete pronaći na GitHubu.