Ръководство за Apache Commons Collections CollectionUtils

Тази статия е част от поредица: • Чанта за колекции на Apache Commons

• Apache Commons Collections SetUtils

• Колекции на Apache Commons OrderedMap

• Колекции Apache Commons BidiMap

• Ръководство за Apache Commons Collections CollectionUtils (текуща статия) • Apache Commons Collections MapUtils

• Ръководство за Apache Commons CircularFifoQueue

1. Общ преглед

Просто казано, Apache CollectionUtils предоставя полезни методи за общи операции, които обхващат широк спектър от случаи на употреба и помага за избягване на писането на шаблонния код. Библиотеката е насочена към по-стари версии на JVM, тъй като в момента подобна функционалност се предоставя от API 8 Stream API на Java 8 .

2. Зависимости на Maven

Трябва да добавим следната зависимост, за да започнем с CollectionUtils:

 org.apache.commons commons-collections4 4.1 

Най-новата версия на библиотеката можете да намерите тук.

3. Настройка

Нека добавим класове за клиенти и адреси:

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 }

Също така ще поддържаме под ръка следните екземпляри на клиенти и списъци, готови да тестваме нашето изпълнение:

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

Нека да разгледаме някои от най-използваните методи в класа на Apache Commons CollectionUtils .

4.1. Добавяне само на ненулеви елементи

Можем да използваме метода addIgnoreNull на CollectionUtils, за да добавим само ненулеви елементи към предоставената колекция.

Първият аргумент към този метод е колекцията, към която искаме да добавим елемента, а вторият аргумент е елементът, който искаме да добавим:

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

Забележете, че нулата не е добавена към списъка.

4.2. Сравняване на списъци

Можем да използваме Подредени метод, за да съпоставя две вече сортирани списъци. Този метод приема двата списъка, които искаме да обединим, като аргументи и връща един сортиран списък:

@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. Преобразуване на обекти

Можем да използваме трансформира метод за трансформиране на обекти от клас А в различни обекти от клас Б. Този метод отнема списък на обекти от клас А и трансформатор като аргументи.

Резултатът от тази операция е списък с обекти от клас 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. Филтриране на обекти

С помощта на филтър можем да премахнем от списък обекти, които не отговарят на дадено условие . Методът взема списъка като първи аргумент, а предикат като втори аргумент.

Методът filterInverse прави обратното. Той премахва обекти от списъка, когато предикатът връща true.

И filter, и filterInverse връщат true, ако входният списък е модифициран, т.е. ако поне един обект е филтриран от списъка:

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

Можем да използваме select и selectRejected, ако искаме полученият списък да бъде върнат, а не булев флаг.

4.5. Проверка за непразни

Методът isNotEmpty е доста удобен, когато искаме да проверим дали има поне един елемент в списък. Другият начин за проверка на същото е:

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

Въпреки че горният ред код прави същото, CollectionUtils.isNotEmpty поддържа нашия код по-чист:

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

В isEmpty прави точно обратното. Той проверява дали даденият списък е нулев или в списъка има нулеви елементи:

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

4.6. Проверка на включването

Можем да използваме isSubCollection, за да проверим дали дадена колекция се съдържа в друга колекция. isSubCollection приема две колекции като аргументи и връща true, ако първата колекция е подколекция на втората колекция:

@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.

Напред » Apache Commons Колекции MapUtils « Предишни Apache Commons Колекции BidiMap