Cara Menemukan Elemen dalam Daftar dengan Java

1. Ikhtisar

Menemukan elemen dalam daftar adalah tugas yang sangat umum yang kami temui sebagai pengembang.

Dalam tutorial singkat ini, kami akan membahas berbagai cara melakukan ini dengan Java.

2. Penyiapan

Pertama mari kita mulai dengan mendefinisikan POJO Pelanggan :

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

Kemudian ArrayList pelanggan:

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

Perhatikan bahwa kami telah mengganti hashCode dan yang sama di kelas Pelanggan kami .

Berdasarkan implementasi sama kami saat ini , dua objek Pelanggan dengan id yang sama akan dianggap sama.

Kami akan menggunakan daftar pelanggan ini di sepanjang jalan.

3. Menggunakan Java API

Java sendiri menyediakan beberapa cara untuk menemukan item dalam daftar:

  • The berisi metode
  • The indexOf Metode
  • Perulangan ad-hoc
  • The Streaming API

3.1. mengandung()

Daftar memperlihatkan metode yang disebut berisi :

boolean contains(Object element)

Seperti namanya, metode ini mengembalikan nilai benar jika daftar berisi elemen yang ditentukan , dan mengembalikan nilai salah jika tidak.

Jadi ketika kami perlu memeriksa apakah item tertentu ada dalam daftar kami, kami dapat:

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

3.2. Indeks()

indexOf adalah metode lain yang berguna untuk menemukan elemen:

int indexOf(Object element)

Metode ini mengembalikan indeks kemunculan pertama dari elemen yang ditentukan dalam daftar yang diberikan, atau -1 jika daftar tidak berisi elemen .

Jadi secara logis, jika metode ini mengembalikan apa pun selain -1, kita tahu bahwa daftar tersebut berisi elemen:

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

Keuntungan utama menggunakan metode ini adalah dapat memberi tahu kita posisi elemen yang ditentukan dalam daftar yang diberikan.

3.3. Pendauran Dasar

Sekarang bagaimana jika kita ingin melakukan pencarian berbasis lapangan untuk sebuah elemen? Misalnya, kami mengumumkan lotre dan kami perlu mengumumkan Pelanggan dengan nama tertentu sebagai pemenang.

Untuk pencarian berbasis lapangan seperti itu, kita dapat beralih ke iterasi.

Cara tradisional untuk melakukan iterasi melalui daftar adalah dengan menggunakan salah satu konstruksi perulangan Java. Di setiap iterasi, kami membandingkan item saat ini dalam daftar dengan elemen yang kami cari untuk melihat apakah cocok:

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

Di sini, nama mengacu pada nama yang kami cari di daftar pelanggan yang diberikan . Metode ini mengembalikan objek Pelanggan pertama dalam daftar dengan nama yang cocok , atau null jika Pelanggan tersebut tidak ada.

3.4. Pendauran Dengan Iterator

Iterator adalah cara lain untuk menelusuri daftar item.

Kami cukup mengambil contoh kami sebelumnya dan mengubahnya sedikit:

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; }

Akibatnya, tingkah lakunya sama seperti dulu.

3.5. Java 8 Stream API

Mulai dari Java 8, kita juga dapat menggunakan Stream API untuk menemukan elemen dalam Daftar.

Untuk menemukan elemen yang cocok dengan kriteria tertentu dalam daftar yang diberikan, kami:

  • panggil stream () di daftar
  • panggil metode f ilter () dengan Predikat yang tepat
  • memanggil konstruksi findAny () , yang mengembalikan elemen pertama yang cocok dengan predikat filter yang dibungkus dalam Opsional jika elemen tersebut ada

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

Untuk kenyamanan, kami menetapkan default ke null jika Opsional kosong, tetapi ini mungkin tidak selalu menjadi pilihan terbaik untuk setiap skenario.

4. Perpustakaan Pihak Ketiga

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()); } });

Ada beberapa perbedaan penting:

  1. Apache Commons hanya mengembalikan null jika kami meneruskan daftar null .
  2. Itutidak menyediakan fungsionalitas nilai default seperti tryFind Guava .

5. Kesimpulan

Dalam artikel ini, kita mempelajari berbagai cara untuk menemukan elemen dalam List, dimulai dengan pemeriksaan keberadaan cepat dan diakhiri dengan pencarian berbasis lapangan.

Kami juga melihat pustaka pihak ketiga Google Guava dan Apache Commons sebagai alternatif untuk Java 8 Streams API.

Terima kasih telah mampir, dan ingatlah untuk memeriksa semua sumber untuk contoh-contoh ini di GitHub.