Sådan finder du et element på en liste med Java

1. Oversigt

At finde et element på en liste er en meget almindelig opgave, vi støder på som udviklere.

I denne hurtige vejledning dækker vi forskellige måder, vi kan gøre dette på Java.

2. Opsætning

Lad os først starte med at definere en Kunde POJO:

offentlig klasse kunde {privat int id; privat strengnavn; // getters / setters, tilpasset hashcode / er lig med}

Så en ArrayList af kunder:

Listekunder = ny ArrayList (); customers.add (ny kunde (1, "Jack")); customers.add (ny kunde (2, "James")); customers.add (ny kunde (3, "Kelly")); 

Bemærk, at vi har tilsidesat hashCode og lige med i vores Kunde klasse.

Baseret på vores nuværende implementering af lige med, to Kunde genstande med det samme id vil blive betragtet som lige.

Vi bruger denne liste over kunder langs vejen.

3. Brug af Java API

Java giver selv flere måder at finde et element på en liste:

  • Det indeholder metode
  • Det indeks af metode
  • En ad-hoc for loop
  • Det Strøm API

3.1. indeholder()

Liste afslører en kaldet metode indeholder:

boolean indeholder (Objektelement)

Som navnet antyder, vender denne metode tilbage rigtigt hvis listen indeholder det specificerede element, og vender tilbage falsk Ellers.

Så når vi skal kontrollere, om der findes en bestemt vare på vores liste, kan vi:

Kunde james = ny kunde (2, "James"); hvis (kunder. indeholder (james)) {// ...}

3.2. indeks af()

indeks af er en anden nyttig metode til at finde elementer:

int indexOf (Objektelement)

Denne metode returnerer indekset for den første forekomst af det specificerede element i den givne liste eller -1, hvis listen ikke indeholder element.

Så logisk, hvis denne metode returnerer andet end -1, ved vi, at listen indeholder elementet:

hvis (kunder.indexOf (james)! = -1) {// ...}

Den største fordel ved at bruge denne metode er, at den kan fortælle os placeringen af ​​det angivne element i den givne liste.

3.3. Grundlæggende looping

Hvad nu hvis vi vil foretage en feltbaseret søgning efter et element? Sig for eksempel, at vi annoncerer et lotteri, og at vi er nødt til at erklære et Kunde med en specifik navn som vinder.

For sådanne feltbaserede søgninger kan vi henvende os til iteration.

En traditionel måde at gentage sig gennem en liste er at bruge en af ​​Java's looping-konstruktioner. I hver iteration sammenligner vi det aktuelle element på listen med det element, vi leder efter for at se, om det er et match:

offentlig kunde findUsingEnhancedForLoop (strengnavn, liste kunder) {for (kundekunde: kunder) {hvis (customer.getName (). er lig med (navn)) {retur kunde; }} returner null; }

Her er navn henviser til det navn, vi søger efter i den givne liste over kunder. Denne metode returnerer den første Kunde objekt på listen med en matchende navn, eller nul hvis ikke sådan Kunde eksisterer.

3.4. Looping med en Iterator

Iterator er en anden måde, hvorpå vi kan krydse en liste over emner.

Vi kan simpelthen tage vores tidligere eksempel og tilpasse det lidt:

offentlig kunde findUsingIterator (strengnavn, listekunder) {Iterator iterator = kunder.iterator (); mens (iterator.hasNext ()) {Kundekunde = iterator.next (); hvis (customer.getName (). er lig med (name)) {return customer; }} returner null; }

Derfor er adfærden den samme som før.

3.5. Java 8 Strøm API

Fra og med Java 8 kan vi også bruge Strøm API til at finde et element i en Liste.

For at finde et element, der matcher specifikke kriterier på en given liste, skal vi:

  • påberåbe sig strøm() på listen
  • ring til filter () metode med en ordentlig Prædikat
  • ring til findAny () konstruktion, som vender tilbage det første element, der matcher filter prædikat pakket ind i et Valgfri hvis der findes et sådant element

Customer james = customers.stream () .filter (customer -> "James" .equals (customer.getName ())) .findAny () .orElse (null);

For nemheds skyld er vi standard til nul i tilfælde af en Valgfri er tom, men dette er måske ikke altid det bedste valg for alle scenarier.

4. Tredjepartsbiblioteker

Nu, mens Stream API er mere end tilstrækkelig, hvad skal vi gøre, hvis vi sidder fast i en tidligere version af Java?

Heldigvis er der mange tredjepartsbiblioteker som Google Guava og Apache Commons, som vi kan bruge.

4.1. Google Guava

Google Guava tilbyder funktionalitet, der svarer til hvad vi kan gøre med streams:

Customer james = Iterables.tryFind (kunder, nyt Predicate () {public boolean apply (Customer customer) {return "James" .equals (customer.getName ());}}). OrNull ();

Ligesom med Strøm API, kan vi valgfrit vælge at returnere en standardværdi i stedet for nul:

Customer james = Iterables.tryFind (kunder, nyt Predikat () {public boolean apply (Customer customer) {return "James" .equals (customer.getName ());}}). Or (customers.get (0));

Ovenstående kode vælger det første element på listen, hvis der ikke findes noget match.

Glem ikke, at Guava kaster en NullPointerException hvis enten listen eller prædikatet er nul.

4.2. Apache Commons

Vi kan finde et element på næsten nøjagtig samme måde ved hjælp af Apache Commons:

Customer james = IterableUtils.find (kunder, nyt Predicate () {public boolean evaluere (Kundekunde) {returner "James" .equals (customer.getName ());}});

Der er dog et par vigtige forskelle:

  1. Apache Commons vender lige tilbage nul hvis vi passerer en nul liste.
  2. Detgiver ikke standardværdifunktionalitet som Guavas tryFind.

5. Konklusion

I denne artikel lærte vi forskellige måder at finde et element i en Liste, starting med hurtig eksistenskontrol og efterbehandling med feltbaserede søgninger.

Vi kiggede også på tredjepartsbibliotekerne Google Guava og Apache Commons som alternativer til Java 8 Strømme API.

Tak fordi du kom forbi, og husk at tjekke alle kilderne til disse eksempler på GitHub.