So finden Sie mit Java ein Element in einer Liste

1. Übersicht

Das Finden eines Elements in einer Liste ist eine sehr häufige Aufgabe, auf die wir als Entwickler stoßen.

In diesem kurzen Tutorial werden wir verschiedene Möglichkeiten behandeln, wie wir dies mit Java tun können.

2. Setup

Beginnen wir mit der Definition eines Kunden- POJO:

public class Customer { private int id; private String name; // getters/setters, custom hashcode/equals }

Dann eine ArrayList von Kunden:

List customers = new ArrayList(); customers.add(new Customer(1, "Jack")); customers.add(new Customer(2, "James")); customers.add(new Customer(3, "Kelly")); 

Beachten Sie, dass wir außer Kraft gesetzt haben hashCode und equals in unserer Kundenklasse.

Basierend auf unserer aktuellen Implementierung von equals werden zwei Kundenobjekte mit derselben ID als gleich betrachtet.

Wir werden diese Kundenliste auf dem Weg verwenden.

3. Verwenden der Java-API

Java selbst bietet verschiedene Möglichkeiten, um ein Element in einer Liste zu finden:

  • Die enthält Methode
  • Die indexOf- Methode
  • Eine Ad-hoc-for-Schleife
  • Die Stream- API

3.1. enthält ()

List macht eine Methode namens enthält verfügbar :

boolean contains(Object element)

Wie der Name schon sagt, gibt diese Methode wahr , wenn die Liste das angegebene enthält Element, und kehrt falsch anders.

Wenn wir also überprüfen müssen, ob ein bestimmtes Element in unserer Liste vorhanden ist, können wir:

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

3.2. Index von()

indexOf ist eine weitere nützliche Methode zum Auffinden von Elementen:

int indexOf(Object element)

Diese Methode gibt den Index des ersten Vorkommens des angegebenen Elements in der angegebenen Liste zurück oder -1, wenn die Liste das Element nicht enthält .

Wenn diese Methode also etwas anderes als -1 zurückgibt, wissen wir logischerweise, dass die Liste das Element enthält:

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

Der Hauptvorteil dieser Methode besteht darin, dass sie uns die Position des angegebenen Elements in der angegebenen Liste mitteilen kann.

3.3. Grundlegendes Looping

Was ist nun, wenn wir eine feldbasierte Suche nach einem Element durchführen möchten? Angenommen, wir kündigen eine Lotterie an und müssen einen Kunden mit einem bestimmten Namen als Gewinner deklarieren .

Für solche feldbasierten Suchen können wir uns der Iteration zuwenden.

Eine traditionelle Methode zum Durchlaufen einer Liste ist die Verwendung eines der Java-Schleifenkonstrukte. In jeder Iteration vergleichen wir das aktuelle Element in der Liste mit dem Element, nach dem wir suchen, um festzustellen, ob es übereinstimmt:

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

Hier ist der Name bezieht sich auf den Namen wir in der gegebenen Liste suchen Kunden . Diese Methode gibt das erste Kundenobjekt in der Liste mit einem übereinstimmenden Namen zurück oder null, wenn kein solcher Kunde vorhanden ist.

3.4. Schleifen mit einem Iterator

Iterator ist eine weitere Möglichkeit, eine Liste von Elementen zu durchlaufen.

Wir können einfach unser vorheriges Beispiel nehmen und es ein wenig optimieren:

public Customer findUsingIterator( String name, List customers) { Iterator iterator = customers.iterator(); while (iterator.hasNext()) { Customer customer = iterator.next(); if (customer.getName().equals(name)) { return customer; } } return null; }

Folglich ist das Verhalten das gleiche wie zuvor.

3.5. Java 8 Stream API

Ab Java 8 können wir auch die Stream- API verwenden, um ein Element in einer Liste zu finden.

Um ein Element zu finden, das bestimmten Kriterien in einer bestimmten Liste entspricht, gehen wir wie folgt vor:

  • Rufen Sie stream () in der Liste auf
  • nennt die f ilter () Methode mit einer geeigneten Predicate
  • Rufen Sie das Konstrukt findAny () auf , das das erste Element zurückgibt, das dem in ein Optional eingeschlossenen Filterprädikat entspricht, wenn ein solches Element vorhanden ist

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

Der Einfachheit halber verwenden wir standardmäßig null, falls eine Option leer ist. Dies ist jedoch möglicherweise nicht immer die beste Wahl für jedes Szenario.

4. Bibliotheken von Drittanbietern

Now, while the Stream API is more than sufficient, what should we do if we're stuck on an earlier version of Java?

Fortunately, there are many third-party libraries like Google Guava and Apache Commons which we can use.

4.1. Google Guava

Google Guava provides functionality that is similar to what we can do with streams:

Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).orNull();

Just like with Stream API, we can optionally choose to return a default value instead of null:

Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).or(customers.get(0));

The above code will pick the first element in the list if no match is found.

Also, don't forget that Guava throws a NullPointerException if either the list or the predicate is null.

4.2. Apache Commons

We can find an element in almost the exact same way using Apache Commons:

Customer james = IterableUtils.find(customers, new Predicate() { public boolean evaluate(Customer customer) { return "James".equals(customer.getName()); } });

Es gibt jedoch einige wichtige Unterschiede:

  1. Apache Commons gibt nur null zurück, wenn wir eine Nullliste übergeben .
  2. Esbietet keine Standardwertfunktionalität wie Guavas tryFind.

5. Schlussfolgerung

In diesem Artikel haben wir verschiedene Methoden kennengelernt , um ein Element in einer Liste zu finden, indem wir mit schnellen Existenzprüfungen begonnen und mit feldbasierten Suchen abgeschlossen haben.

Wir haben uns auch die Bibliotheken von Drittanbietern Google Guava und Apache Commons als Alternativen zur Java 8 Streams- API angesehen.

Vielen Dank für Ihren Besuch und denken Sie daran, alle Quellen für diese Beispiele auf GitHub zu lesen.