Fjerne elementer fra Java-samlinger

1. Oversikt

I denne raske opplæringen, vi skal snakke om fire forskjellige måter å fjerne elementer fra Java Samlinger som samsvarer med visse predikater.

Vi vil naturligvis også se på noen av advarslene.

2. Definere samlingen vår

Først skal vi illustrere to tilnærminger som muterer den opprinnelige datastrukturen. Så snakker vi om to andre alternativer som i stedet for å fjerne elementene, vil lage en kopi av originalen Samling uten dem.

La oss bruke følgende samling gjennom eksemplene våre for å demonstrere hvordan vi kan oppnå det samme resultatet ved hjelp av forskjellige metoder:

Samlingsnavn = ny ArrayList (); names.add ("John"); names.add ("Ana"); names.add ("Mary"); names.add ("Anthony"); names.add ("Mark");

3. Fjerne elementer med Iterator

Java Iterator gjør oss i stand til både å gå og fjerne hvert enkelt element i en Samling.

For å gjøre det, må vi først hente en iterator over elementene ved hjelp av iterator metode. Etterpå kan vi besøke hvert element ved hjelp av neste og fjern dem ved hjelp av fjerne:

Iterator i = names.iterator (); mens (i.hasNext ()) {Streng e = i.next (); hvis (e.startsWith ("A")) {i.remove (); }}

Til tross for sin enkelhet er det noen advarsler vi bør vurdere:

  • Avhengig av samlingen vi kan støte på ConcurrentModificationException unntak
  • Vi må gjenta elementene før vi kan fjerne dem
  • Avhengig av samlingen, fjerne kan oppføre seg annerledes enn forventet. F.eks .: ArrayList.Iterator fjerner elementet fra samlingen og flytter påfølgende data til venstre mens, LinkedList.Iterator bare justerer pekeren til neste element. Som sådan, LinkedList.Iterator presterer mye bedre enn ArrayList.Iterator når du fjerner gjenstander

4. Java 8 og Collection.removeIf ()

Java 8 introduserte en ny metode for de Samling grensesnitt som gir en mer kortfattet måte å fjerne elementer ved hjelp av Predikere:

names.removeIf (e -> e.startsWith ("A"));

Det er viktig å merke seg at i motsetning til Iterator nærme seg, fjerneHvis fungerer like bra i begge LinkedList og ArrayList.

I Java 8, ArrayList overstyrer standardimplementeringen - som er avhengig av Iterator - og implementerer en annen strategi: for det første går den over elementene og markerer de som samsvarer med vår Predikere; etterpå gjentas det en gang til for å fjerne (og skifte) elementene som ble markert i den første iterasjonen.

5. Java 8 og introduksjonen av Strøm

En av de nye hovedfunksjonene i Java 8 var tillegg av Strøm (og Samlere). Det er mange måter å lage en Strøm fra en kilde. Imidlertid er de fleste operasjoner som påvirker Strøm eksempel vil ikke mutere kilden, heller fokuserer API-en på å lage kopier av en kilde og utføre alle operasjoner vi måtte trenge i dem.

La oss ta en titt på hvordan vi kan bruke Strøm og Samlere for å finne / filtrere elementer som samsvarer med, og ikke samsvarer, med vår Predikere.

5.1. Fjerne elementer med Strøm

Fjerner, eller rettere sagt, filtreringselementer ved hjelp av Strøm er ganske grei, vi trenger bare å lage en forekomst av Strøm bruker vår Samling, påkalle filter med vår Predikere og så samle inn resultatet ved hjelp av Samlere:

Samling filteredCollection = navn .stream () .filter (e ->! E.startsWith ("A")) .collect (Collectors.toList ());

Streaming er mindre invasiv enn tidligere tilnærminger, det fremmer isolasjon og muliggjør oppretting av flere kopier fra samme kilde. Vi bør imidlertid huske på at det også øker minnet som brukes av applikasjonen vår.

5.2. Collectors.partitioningBy

Kombinere begge deler Stream.filter og Samlere er ganske hendig, skjønt vi kan komme i scenarier der vi trenger både matchende og ikke-samsvarende elementer. I slike tilfeller kan vi dra nytte av det Collectors.partitioningBy:

Kart classifiedElements = names .stream () .collect (Collectors.partitioningBy ((String e) ->! e.startsWith ("A"))); String matching = String.join (",", classifiedElements.get (true)); String nonMatching = String.join (",", classifiedElements.get (false));

Denne metoden returnerer a Kart som bare inneholder to nøkler, ekte og falsk, som hver peker på en liste som inneholder henholdsvis samsvarende og ikke-samsvarende elementer.

6. Konklusjon

I denne artikkelen så vi på noen metoder for å fjerne elementer fra Samlinger og noen av advarslene deres.

Du kan finne den komplette kildekoden og alle kodebiter for denne artikkelen på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found