Menghapus Elemen dari Koleksi Java

1. Ikhtisar

Dalam tutorial singkat ini, kita akan berbicara tentang empat cara berbeda untuk menghapus item dari Koleksi Java yang cocok dengan predikat tertentu.

Kami secara alami juga akan melihat beberapa peringatan.

2. Mendefinisikan Koleksi Kami

Pertama, kami akan mengilustrasikan dua pendekatan yang mengubah struktur data asli. Kemudian kita akan berbicara tentang dua opsi lain yang alih-alih menghapus item, akan membuat salinan Koleksi asli tanpanya.

Mari gunakan koleksi berikut di seluruh contoh kita untuk mendemonstrasikan bagaimana kita dapat mencapai hasil yang sama menggunakan metode yang berbeda:

Collection names = new ArrayList(); names.add("John"); names.add("Ana"); names.add("Mary"); names.add("Anthony"); names.add("Mark");

3. Menghapus Elemen Dengan Iterator

Iterator Java memungkinkan kita untuk berjalan dan menghapus setiap elemen dalam Koleksi .

Untuk melakukannya, pertama-tama kita perlu mengambil iterator di atas elemennya menggunakan metode iterator . Setelah itu, kita dapat mengunjungi setiap elemen dengan bantuan next dan menghapusnya menggunakan hapus :

Iterator i = names.iterator(); while(i.hasNext()) { String e = i.next(); if (e.startsWith("A")) { i.remove(); } }

Terlepas dari kesederhanaannya, ada beberapa hal yang perlu dipertimbangkan:

  • Bergantung pada koleksi, kami mungkin mengalami pengecualian ConcurrentModificationException
  • Kita perlu mengulang elemen sebelum kita bisa menghapusnya
  • Bergantung pada koleksinya, remove mungkin berperilaku berbeda dari yang diharapkan. Misalnya: ArrayList.Iterator menghapus elemen dari kumpulan dan menggeser data berikutnya ke kiri sedangkan, LinkedList.Iterator hanya menyesuaikan penunjuk ke elemen berikutnya. Dengan demikian, LinkedList.Iterator bekerja jauh lebih baik daripada ArrayList.Iterator saat menghapus item

4. Java 8 dan Collection.removeIf ()

Java 8 memperkenalkan metode baru untuk para Koleksi antarmuka yang menyediakan cara yang lebih ringkas untuk menghapus elemen menggunakan Predikat :

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

Penting untuk dicatat bahwa berlawanan dengan pendekatan Iterator , removeIf bekerja dengan baik di LinkedList dan ArrayList .

Di Java 8, ArrayList menimpa implementasi default - yang bergantung pada Iterator - dan mengimplementasikan strategi yang berbeda: pertama, melakukan iterasi atas elemen dan menandai elemen yang cocok dengan Predicate kami ; setelah itu, iterasi untuk kedua kalinya untuk menghapus (dan menggeser) elemen yang telah ditandai pada iterasi pertama.

5. Java 8 dan Pengenalan Stream

Salah satu fitur utama baru di Java 8 adalah penambahan Stream (dan Kolektor ). Ada banyak cara untuk membuat Arus dari sumber. Namun, sebagian besar operasi yang memengaruhi instance Stream tidak akan mengubah sumbernya, sebaliknya, API berfokus pada pembuatan salinan sumber dan melakukan operasi apa pun yang mungkin kami perlukan di dalamnya.

Mari kita lihat bagaimana kita dapat menggunakan Aliran dan Kolektor untuk menemukan / memfilter elemen yang cocok, dan tidak cocok, Predikat kita .

5.1. Menghapus Elemen Dengan Stream

Menghapus, atau lebih tepatnya, memfilter elemen menggunakan Stream cukup mudah , kita hanya perlu membuat instance Stream menggunakan Collection kita , memanggil filter dengan Predicate kita dan kemudian mengumpulkan hasilnya dengan bantuan Kolektor:

Collection filteredCollection = names .stream() .filter(e -> !e.startsWith("A")) .collect(Collectors.toList());

Streaming kurang invasif daripada pendekatan sebelumnya, ini mempromosikan isolasi dan memungkinkan pembuatan banyak salinan dari sumber yang sama. Namun, kita harus ingat bahwa ini juga meningkatkan memori yang digunakan oleh aplikasi kita.

5.2. Collectors.partitioningBy

Menggabungkan Stream.filter dan Collectors cukup berguna, meskipun kita mungkin mengalami skenario di mana kita membutuhkan elemen yang cocok dan tidak cocok. Dalam kasus seperti itu, kami dapat memanfaatkan Collectors.partitioningBy :

Map
    
      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));
    

Metode ini mengembalikan Peta yang hanya berisi dua kunci, benar dan salah , masing-masing menunjuk ke daftar yang masing-masing berisi elemen yang cocok dan tidak cocok.

6. Kesimpulan

Dalam artikel ini, kami melihat beberapa metode untuk menghapus elemen dari Koleksi dan beberapa peringatannya.

Anda dapat menemukan kode sumber lengkap dan semua cuplikan kode untuk artikel ini di GitHub.