Hoe u een element in een lijst kunt vinden met Java

1. Overzicht

Het vinden van een element in een lijst is een veel voorkomende taak die we als ontwikkelaars tegenkomen.

In deze korte tutorial bespreken we verschillende manieren waarop we dit met Java kunnen doen.

2. Installatie

Laten we eerst beginnen met het definiëren van een Klant POJO:

openbare klasse Klant {privé int id; private String naam; // getters / setters, aangepaste hashcode / is gelijk aan}

Dan een ArrayList van klanten:

Lijst met klanten = nieuwe ArrayList (); customers.add (nieuwe klant (1, "Jack")); customers.add (nieuwe klant (2, "James")); customers.add (nieuwe klant (3, "Kelly")); 

Merk op dat we hebben overschreven hashCode en is gelijk aan in onze Klant klasse.

Gebaseerd op onze huidige implementatie van is gelijk aan, twee Klant objecten met hetzelfde ID kaart zal als gelijk worden beschouwd.

We gebruiken deze lijst met klanten onderweg.

3. Java API gebruiken

Java zelf biedt verschillende manieren om een ​​item in een lijst te vinden:

  • De bevat methode
  • De index van methode
  • Een ad-hoc for loop
  • De Stroom API

3.1. bevat ()

Lijst geeft een methode weer met de naam bevat:

boolean bevat (objectelement)

Zoals de naam suggereert, keert deze methode terug waar als de lijst het gespecificeerde bevat element, en keert terug false anders.

Dus als we moeten controleren of een specifiek item in onze lijst voorkomt, kunnen we:

Customer james = nieuwe klant (2, "James"); if (customers.contains (james)) {// ...}

3.2. index van()

index van is een andere handige methode om elementen te vinden:

int indexOf (objectelement)

Deze methode retourneert de index van het eerste exemplaar van het opgegeven element in de gegeven lijst, of -1 als de lijst niet de element.

Dus logischerwijs, als deze methode iets anders dan -1 retourneert, weten we dat de lijst het element bevat:

if (klanten.indexOf (james)! = -1) {// ...}

Het belangrijkste voordeel van het gebruik van deze methode is dat het ons de positie van het gespecificeerde element in de gegeven lijst kan vertellen.

3.3. Basis looping

Wat als we een veldgebaseerde zoekopdracht naar een element willen doen? Stel dat we een loterij aankondigen en dat we een Klant met een specifiek naam als winnaar.

Voor dergelijke op velden gebaseerde zoekopdrachten kunnen we gebruik maken van iteratie.

Een traditionele manier om door een lijst te lopen, is door een van Java's looping-constructies te gebruiken. In elke iteratie vergelijken we het huidige item in de lijst met het element dat we zoeken om te zien of het een match is:

public Customer findUsingEnhancedForLoop (String name, List customers) {for (Customer customer: customers) {if (customer.getName (). equals (name)) {terugkerende klant; }} retourneer null; }

Hier de naam verwijst naar de naam waarnaar we zoeken in de gegeven lijst met klanten. Deze methode retourneert de eerste Klant object in de lijst met een matching naam, of nul zo niet Klant bestaat.

3.4. Looping met een Iterator

Iterator is een andere manier waarop we een lijst met items kunnen doorlopen.

We kunnen gewoon ons vorige voorbeeld nemen en het een beetje aanpassen:

openbare klant findUsingIterator (tekenreeksnaam, lijstklanten) {Iterator iterator = customers.iterator (); while (iterator.hasNext ()) {Klant klant = iterator.next (); if (customer.getName (). equals (name)) {terugkerende klant; }} retourneer null; }

Bijgevolg is het gedrag hetzelfde als voorheen.

3.5. Java 8 Stroom API

Vanaf Java 8 kunnen we ook de Stroom API om een ​​element in een Lijst.

Om een ​​element te vinden dat aan specifieke criteria in een bepaalde lijst voldoet, doen we het volgende:

  • beroep doen op stroom() op de lijst
  • bel de filter () methode met een juiste Predikaat
  • bel de findAny () construct, dat terugkeert het eerste element dat overeenkomt met het filter predikaat verpakt in een Optioneel als een dergelijk element bestaat

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

Voor het gemak zijn we standaard ingesteld op nul in het geval een Optioneel leeg is, maar dit is misschien niet altijd de beste keuze voor elk scenario.

4. Bibliotheken van derden

Nu, terwijl de Stream API meer dan voldoende is, wat moeten we doen als we vastlopen op een eerdere versie van Java?

Gelukkig zijn er veel bibliotheken van derden, zoals Google Guava en Apache Commons, die we kunnen gebruiken.

4.1. Google Guava

Google Guava biedt functionaliteit die vergelijkbaar is met wat we kunnen doen met streams:

Customer james = Iterables.tryFind (klanten, nieuw predikaat () {openbare boolean toepassen (klant klant) {retourneer "James" .equals (customer.getName ());}}). OrNull ();

Net als bij Stroom API kunnen we er optioneel voor kiezen om een ​​standaardwaarde te retourneren in plaats van nul:

Customer james = Iterables.tryFind (klanten, nieuw predikaat () {openbare boolean toepassen (klant klant) {retourneer "James" .equals (customer.getName ());}}). Of (klanten.get (0));

De bovenstaande code kiest het eerste element in de lijst als er geen overeenkomst wordt gevonden.

Vergeet ook niet dat Guava een NullPointerException of de lijst of het predikaat is nul.

4.2. Apache Commons

We kunnen een element op bijna exact dezelfde manier vinden met Apache Commons:

Customer james = IterableUtils.find (klanten, nieuw predikaat () {openbare booleaanse evaluatie (klant klant) {retourneer "James" .equals (customer.getName ());}});

Er zijn echter een aantal belangrijke verschillen:

  1. Apache Commons keert gewoon terug nul als we een nul lijst.
  2. Hetbiedt geen standaardwaardefunctionaliteit zoals die van Guava tryFind.

5. Conclusie

In dit artikel hebben we verschillende manieren geleerd om een ​​element in een Lijst, sbeginnen met snelle existentiecontroles en eindigen met op velden gebaseerde zoekopdrachten.

We hebben ook gekeken naar de bibliotheken van derden Google Guava en Apache Commons als alternatief voor de Java 8 Streams API.

Bedankt voor het langskomen, en vergeet niet om alle bronnen voor deze voorbeelden te bekijken op GitHub.