Panduan untuk Koleksi Koleksi Apache Commons

Artikel ini adalah sebahagian daripada siri: • Beg Koleksi Apache Commons

• Set Koleksi Apache Commons

• Peta Apache Commons CollectedMap

• BidiMap Koleksi Apache Commons

• Panduan untuk Koleksi Koleksi Apache CommonsUtils (artikel semasa) • Koleksi Apache Commons MapUtils

• Panduan untuk Apache Commons CircularFifoQueue

1. Gambaran keseluruhan

Ringkasnya, Apache CollectionUtils menyediakan kaedah utiliti untuk operasi biasa yang merangkumi pelbagai kes penggunaan dan membantu mengelakkan penulisan kod plat boiler Perpustakaan menargetkan rilis JVM yang lebih lama kerana pada masa ini, fungsi serupa disediakan oleh Java Stream 8 API.

2. Pergantungan Maven

Kita perlu menambahkan kebergantungan berikut untuk memulakan dengan CollectionUtils:

 org.apache.commons commons-collections4 4.1 

Versi perpustakaan terkini boleh didapati di sini.

3. Persediaan

Mari tambah 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 menyimpan berguna berikut Pelanggan dan Senarai keadaan bersedia untuk menguji pelaksanaan 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. KoleksiUtil

Mari kita ikuti beberapa kaedah yang paling banyak digunakan di kelas Apache Commons CollectionUtils .

4.1. Menambah Elemen Bukan Null sahaja

Kita boleh menggunakan kaedah AddIgnoreNull CollectionUtils untuk menambahkan unsur bukan null sahaja pada koleksi yang disediakan.

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

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

Perhatikan bahawa nol tidak ditambahkan ke senarai.

4.2. Menyenaraikan Senarai

Kita boleh menggunakan kumpul semak kaedah untuk mengumpul dua senarai sudah disusun. Kaedah ini mengambil kedua-dua senarai, yang ingin kita gabungkan, sebagai argumen dan mengembalikan senarai yang disusun tunggal:

@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 boleh menggunakan kaedah transform untuk mengubah objek kelas A menjadi objek kelas B. yang berbeza. Kaedah ini mengambil senarai objek kelas A dan pengubah sebagai hujah.

Hasil operasi ini adalah senarai 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. Menapis Objek

Dengan menggunakan penapis, kita dapat membuang objek yang tidak memenuhi syarat tertentu dari senarai . Kaedah ini mengambil senarai sebagai argumen pertama dan Predikat sebagai argumen kedua.

The filterInverse kaedah tidak sebaliknya. Ia mengeluarkan objek dari senarai apabila Predikat kembali benar.

Kedua-dua filter dan filterInverse return benar jika senarai input diubah, iaitu jika sekurang-kurangnya 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 boleh menggunakan select and selectRejected jika kita mahu senarai hasil dikembalikan dan bukannya boolean flag.

4.5. Memeriksa Tidak Kosong

Kaedah isNotEmpty cukup berguna apabila kita ingin memeriksa sama ada terdapat sekurang-kurangnya satu elemen dalam senarai. Cara lain untuk memeriksa perkara yang sama adalah:

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

Walaupun baris kod di atas melakukan perkara yang sama, CollectionUtils.isNotEmpty memastikan kod kami lebih bersih:

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

The isEmpty tidak sebaliknya. Ia memeriksa sama ada senarai yang diberikan adalah nol atau terdapat unsur sifar dalam senarai:

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

4.6. Memeriksa Penyertaan

Kita boleh menggunakan isSubCollection untuk memeriksa apakah koleksi terdapat dalam koleksi lain. isSubCollection mengambil dua koleksi sebagai argumen dan kembali benar 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.

Selanjutnya » Koleksi Apache Commons MapUtils « Koleksi Apache Commons sebelumnya BidiMap