Panduan untuk Apache Commons Collections CollectionUtils

Artikel ini adalah bagian dari serial: • Apache Commons Collections Bag

• Apache Commons Collections SetUtils

• Apache Commons Collections OrderedMap

• Apache Commons Collections BidiMap

• Panduan untuk Apache Commons Collections CollectionUtils (artikel saat ini) • Apache Commons Collections MapUtils

• Panduan untuk Apache Commons CircularFifoQueue

1. Ikhtisar

Sederhananya, Apache CollectionUtils menyediakan metode utilitas untuk operasi umum yang mencakup berbagai kasus penggunaan dan membantu menghindari penulisan kode boilerplate. Library tersebut menargetkan rilis JVM yang lebih lama karena saat ini, fungsionalitas serupa disediakan oleh Stream API Java 8 .

2. Ketergantungan Maven

Kita perlu menambahkan dependensi berikut untuk memulai CollectionUtils:

 org.apache.commons commons-collections4 4.1 

Versi terbaru perpustakaan dapat ditemukan di sini.

3. Penyiapan

Mari tambahkan kelas Pelanggan dan Alamat:

public class Customer { private Integer id; private String name; private Address address; // standard getters and setters } public class Address { private String locality; private String city; // standard getters and setters }

Kami juga akan terus menyediakan contoh Pelanggan dan Daftar berikut yang siap untuk menguji implementasi kami:

Customer customer1 = new Customer(1, "Daniel", "locality1", "city1"); Customer customer2 = new Customer(2, "Fredrik", "locality2", "city2"); Customer customer3 = new Customer(3, "Kyle", "locality3", "city3"); Customer customer4 = new Customer(4, "Bob", "locality4", "city4"); Customer customer5 = new Customer(5, "Cat", "locality5", "city5"); Customer customer6 = new Customer(6, "John", "locality6", "city6"); List list1 = Arrays.asList(customer1, customer2, customer3); List list2 = Arrays.asList(customer4, customer5, customer6); List list3 = Arrays.asList(customer1, customer2); List linkedList1 = new LinkedList(list1);

4. CollectionUtils

Mari kita lihat beberapa metode yang paling sering digunakan di kelas Apache Commons CollectionUtils .

4.1. Menambahkan Hanya Elemen Non-Null

Kita bisa menggunakan metode addIgnoreNull CollectionUtils untuk hanya menambahkan elemen bukan null ke koleksi yang disediakan.

Argumen pertama untuk metode ini adalah kumpulan yang ingin kita tambahkan elemen dan argumen kedua adalah elemen yang ingin kita tambahkan:

@Test public void givenList_whenAddIgnoreNull_thenNoNullAdded() { CollectionUtils.addIgnoreNull(list1, null); assertFalse(list1.contains(null)); }

Perhatikan bahwa null tidak ditambahkan ke daftar.

4.2. Menyusun Daftar

Kita dapat menggunakan susun metode untuk menyusun dua daftar yang sudah diurutkan. Metode ini mengambil kedua daftar, yang ingin kita gabungkan, sebagai argumen dan mengembalikan satu daftar yang diurutkan:

@Test public void givenTwoSortedLists_whenCollated_thenSorted() { List sortedList = CollectionUtils.collate(list1, list2); assertEquals(6, sortedList.size()); assertTrue(sortedList.get(0).getName().equals("Bob")); assertTrue(sortedList.get(2).getName().equals("Daniel")); }

4.3. Mengubah Objek

Kita dapat menggunakan metode transformasi untuk mengubah objek kelas A menjadi objek kelas B. Metode ini mengambil daftar objek kelas A dan transformator sebagai argumen.

Hasil dari operasi ini adalah daftar objek kelas B:

@Test public void givenListOfCustomers_whenTransformed_thenListOfAddress() { Collection addressCol = CollectionUtils.collect(list1, new Transformer() { public Address transform(Customer customer) { return customer.getAddress(); } }); List addressList = new ArrayList(addressCol); assertTrue(addressList.size() == 3); assertTrue(addressList.get(0).getLocality().equals("locality1")); }

4.4. Memfilter Objek

Menggunakan filter kita dapat menghapus objek yang tidak memenuhi kondisi tertentu dari daftar . Metode ini mengambil daftar sebagai argumen pertama dan Predikat sebagai argumen keduanya.

The filterInverse metode tidak sebaliknya. Ini menghapus objek dari daftar ketika Predikat mengembalikan nilai true.

Baik filter dan filterInverse mengembalikan nilai true jika daftar input diubah, yaitu jika setidaknya satu objek disaring dari daftar:

@Test public void givenCustomerList_WhenFiltered_thenCorrectSize() { boolean isModified = CollectionUtils.filter(linkedList1, new Predicate() { public boolean evaluate(Customer customer) { return Arrays.asList("Daniel","Kyle").contains(customer.getName()); } }); assertTrue(linkedList1.size() == 2); }

Kita bisa menggunakan select dan selectRejected jika kita ingin daftar resultan dikembalikan daripada boolean flag.

4.5. Memeriksa Non-Empty

Metode isNotEmpty cukup berguna saat kita ingin memeriksa apakah ada setidaknya satu elemen dalam daftar. Cara lain untuk memeriksa yang sama adalah:

boolean isNotEmpty = (list != null && list.size() > 0);

Meskipun baris kode di atas melakukan hal yang sama, CollectionUtils.isNotEmpty membuat kode kita lebih bersih:

@Test public void givenNonEmptyList_whenCheckedIsNotEmpty_thenTrue() { assertTrue(CollectionUtils.isNotEmpty(list1)); }

The isEmpty tidak sebaliknya. Ini memeriksa apakah daftar yang diberikan nol atau tidak ada elemen dalam daftar:

List emptyList = new ArrayList(); List nullList = null; assertTrue(CollectionUtils.isEmpty(nullList)); assertTrue(CollectionUtils.isEmpty(emptyList));

4.6. Memeriksa Inklusi

Kita dapat menggunakan isSubCollection untuk memeriksa apakah suatu koleksi terdapat dalam koleksi lain. isSubCollection mengambil dua koleksi sebagai argumen dan mengembalikan nilai true jika koleksi pertama adalah subkoleksi dari koleksi kedua:

@Test public void givenCustomerListAndASubcollection_whenChecked_thenTrue() { assertTrue(CollectionUtils.isSubCollection(list3, list1)); }

A collection is sub-collection of another collection if the number of times an object occurs in the first collection is less than or equal to the number of times it occurs in the second collection.

4.7. Intersection of Collections

We can use CollectionUtils.intersection method to get the intersection of two collections. This method takes two collections and returns a collection of elements of which are common in both the input collections:

@Test public void givenTwoLists_whenIntersected_thenCheckSize() { Collection intersection = CollectionUtils.intersection(list1, list3); assertTrue(intersection.size() == 2); }

The number of times an element occurs in the resultant collection is a minimum of the number of times it occurs in each of the given collections.

4.8. Subtracting Collections

CollectionUtils.subtract takes two collections as input and returns a collection which contains elements which are there in the first collection but not in the second collection:

@Test public void givenTwoLists_whenSubtracted_thenCheckElementNotPresentInA() { Collection result = CollectionUtils.subtract(list1, list3); assertFalse(result.contains(customer1)); }

The number of times a collection occurs in the result is the number of times it occurs in first collection minus the number of times it occurs in the second collection.

4.9. Union of Collections

CollectionUtils.union does the union of two collections and returns a collection which contains all the elements which are there in either the first or the second collection.

@Test public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() { Collection union = CollectionUtils.union(list1, list2); assertTrue(union.contains(customer1)); assertTrue(union.contains(customer4)); }

The number of times an element occurs in the resulting collection is the maximum of the number of times it occurs in each of the given collections.

5. Conclusion

And we're done.

We went through some of the commonly used methods of CollectionUtils – which is very much useful to avoid boilerplate when we're working with collections in our Java projects.

As usual, the code is available over on GitHub.

Berikutnya » MapUtils Koleksi Apache Commons « Sebelumnya BidiMap Koleksi Apache Commons