JavaRush /Курсы /JSP & Servlets /Класс CollectionUtils из Apache Commons

Класс CollectionUtils из Apache Commons

JSP & Servlets
20 уровень , 4 лекция
Открыта

Знакомство с CollectionUtils

Еще один универсальный утилитный класс, который содержит много полезных методов:

addAll(Collection<C> collection, C... elements) Добавляет все элементы массива C в коллекцию
addIgnoreNull(Collection<T> collection, T object) Добавляет элемент, если он не null
containsAll(Collection<?> coll1, Collection<?> coll2) Проверяет, что коллекция1 содержит все элементы коллекции2
containsAny(Collection<?> coll1, Collection<?> coll2) Проверяет, что коллекция1 содержит хотя бы один элемент из коллекции2
countMatches(Iterable<C> input, Predicate<? super C> predicate) Подсчитывает, сколько элементов коллекции удовлетворяют правило predicate
disjunction(Iterable<? extends O> a, Iterable<? extends O> b) Возвращает объекты, которые входят только в одну коллекцию, но не сразу в обе
intersection(Iterable<? extends O> a, Iterable<? extends O> b) Возвращает коллекцию объектов, которые входят сразу в обе коллекции
union(Iterable<? extends O> a, Iterable<? extends O> b) Возвращает коллекцию объектов, которые входят хотя бы в одну коллекцию
emptyCollection() Возвращает специальную пустую коллекцию
emptyIfNull(Collection<T> collection) Возвращает пустую коллекцию, если collection == null
exists(Iterable<C> input, Predicate<? super C> predicate) Проверяет, что в коллекции существует элемент, удовлетворяющий правилу predicate
extractSingleton(Collection<E> collection) Возвращает единственный элемент коллекции
filter(Iterable<T> collection, Predicate<? super T> predicate) Фильтрует элементы коллекции
find(Iterable<T> collection, Predicate<? super T> predicate) Ищет элементы коллекции
isEmpty(Collection<?> coll) Проверяет, что коллекция пуста
isEqualCollection(Collection<?> a, Collection<?> b) Сравнивает коллекции
isFull(Collection<? extends Object> coll) Проверяет, можно ли еще добавить элемент в коллекцию
isNotEmpty(Collection<?> coll) Проверят, что коллекция не пуста
isSubCollection(Collection<?> a, Collection<?> b) Проверяет, что коллекция B входит в коллекцию A
matchesAll(Iterable<C> input, Predicate<? super C> predicate) Проверяет, что все элементы коллекции удовлетворяют правилу predicate
removeAll(Collection<E> collection, Collection<?> remove) Удаляет все элементы коллекции
retainAll(Collection<C> collection, Collection<?> retain) Возвращает коллекцию, содержащую все элементы collection, которые также содержатся в retain
reverseArray(Object[] array) Разворачивает массив задом на перед
unmodifiableCollection(Collection<? extends C> collection) Возвращает обертку над коллекцией. Любая попытка модифицировать коллекцию кинет исключение.

Рассмотрим некоторые методы.

Способы проверить пустая ли коллекция

Вот как просто определить, является ли коллекция пустой:


CollectionUtils.isEmpty(null); // true
CollectionUtils.isEmpty(new LinkedList<>()); // true  
CollectionUtils.isEmpty(Collections.singleton(new int[]{2, 1})); // false

Так же легко проверить, что коллекция не пустая:


CollectionUtils.isNotEmpty(null); // false
CollectionUtils.isNotEmpty(new LinkedList<>()); // false  
CollectionUtils.isNotEmpty(Collections.singleton(new int[]{2, 1})); // true

Примеры:


User ivan = new User("Ivan", "ivan@email.com");
User petr = new User("Petr", "petr@email.com");

List<User> users = new ArrayList<>();

System.out.println(CollectionUtils.isEmpty(users)); // true
System.out.println(CollectionUtils.isNotEmpty(users)); // false

users.add(ivan);
users.add(petr);

System.out.println(CollectionUtils.isEmpty(users)); // false
System.out.println(CollectionUtils.isNotEmpty(users)); // true

users = null;
System.out.println(CollectionUtils.isEmpty(users)); // true
System.out.println(CollectionUtils.isNotEmpty(users)); // false

A Guide to Apache Commons Collections CollectionUtils

Операции над множествами

Если тебе приходилось сталкиваться с теорией множеств, то ты знаешь, что над множествами существуют 4 основные операции: объединение, пересечение, разность и дизъюнкция.

Для этих операций у класса CollectionUtils есть 4 метода:

  • union()
  • intersection()
  • disjunction()
  • subtract()

Ниже будут несколько простых примеров:

Объединение


List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//объединяем два множества
Collection<String> result = CollectionUtils.union(firstList, secondList);
System.out.println(ArrayUtils.toString(result));     //[1, 2, 3, 4, 5, 6, 7, 8, 9]

Пересечение


List<String> firstList = Arrays.asList("A", "B", "C", "D", "E", "F");
List<String> secondList = Arrays.asList("B", "D", "F", "G", "H", "K");

//пересечения двух множеств
Collection<String> result = CollectionUtils.intersection(firstList, secondList);
System.out.println(ArrayUtils.toString(result));     //[B, D, F]

Дизъюнкция


List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//дизъюнкция
Collection<String> result = CollectionUtils.disjunction(firstList, secondList);
System.out.println(ArrayUtils.toString(result)); //[1, 4, 5, 7, 8, 9]

Разница (вычет)


List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//разница
Collection<String> result = CollectionUtils.subtract(firstList, secondList);
System.out.println(ArrayUtils.toString(result)); // [1, 4, 5]

Операции над множествами, продолжение

В этом примере показано, как использовать вышеупомянутые четыре метода для работы с двумя коллекциями:


List<Integer> firstList = Arrays.asList(1, 2, 3, 3, 4, 5);
List<Integer> secondList = Arrays.asList(3, 4, 4, 5, 6, 7);

Collection<Integer> union = CollectionUtils.union(firstList, secondList); // Объединение
Collection<Integer> intersection = CollectionUtils.intersection(firstList, secondList); // Пересечение
Collection<Integer> disjunction = CollectionUtils.disjunction(firstList, secondList); // Дизъюнкция
Collection<Integer> subtract = CollectionUtils.subtract(firstList, secondList); // Разница

System.out.println("firstList: " + ArrayUtils.toString(firstList.toArray()));
System.out.println("secondList: " + ArrayUtils.toString(secondList.toArray()));

System.out.println("Объединение: " + ArrayUtils.toString(union.toArray()));
System.out.println("Пересечение: " + ArrayUtils.toString(intersection.toArray()));
System.out.println("Дизъюнкция: " + ArrayUtils.toString(disjunction.toArray()));
System.out.println("Разница: " + ArrayUtils.toString(subtract.toArray()));

Наш результат:

firstList: {1,2,3,3,4,5}
secondList: {3,4,4,5,6,7}
Объединение: {1,2,3,3,4,4,5,6,7}
Пересечение: {3,4,5}
Дизъюнкция: {1,2,3,4,6,7}
Разница: {1,2,3}

Можешь самостоятельно поэкспериментировать с этими методами.

Метод unmodifiableCollection()

Иногда нам приходится реализовывать методы интерфейса, которые должны возвращать коллекции внутренних данных наших объектов. А так как данные внутренние, мы не хотим, чтобы кто-то где-то их менял.

Или мы получили где-то коллекцию, которую не нужно менять, но вынуждены передать ее в какой-то сторонний метод. Где гарантия, что он ее не поменяет?

Для того, чтобы спать спокойно, коллекцию можно обернуть в специальный wrapper, который будет кидать исключение при попытке модифицировать коллекцию.

Пример:


Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection = Collections.unmodifiableCollection(firstCollection);
firstCollection.add("hello");
firstCollection.add("from");
firstCollection.add("javaRush");

//secondCollection.add("have a error");
System.out.println(secondCollection); //[hello, from, javaRush]

Метод Collections.unmodifiableCollection() возвращает обертку над переданной ему коллекцией. Если вызывать у нее методы get(), size(), то все будет работать. Однако при вызове методов add(), set(), remove() ты получишь исключение.

java.lang.UnsupportedOperationException
at org.apache.commons.collections.collection.UnmodifiableCollection.add(UnmodifiableCollection.java:75)

На самом деле уже сейчас метод помечен как deprecated и вместо него рекомендуется использовать Collections.unmodifiableCollection(Collection<? extends T> c).


Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Артём Уровень 112
30 апреля 2025
В абзаце про unmodifiableCollection() в первом примере должно быть: Collection<String> secondCollection = CollectionUtils.unmodifiableCollection(firstCollection); А то у вас первый пример от второго ничем не отличается.
И. Ж. Уровень 41
26 мая 2024
Так в firstCollection можно добавлять, а в secondCollection нельзя? И почему при добавлении в firstCollection, secondCollection изменилась, то есть добавилось туда, она же неизменяемая?!
Андрей Пазюк Уровень 117 Expert
27 сентября 2024
И. Ж. потому что Collections.unmodifiableCollection() возвращает обертку над коллекцией, которая кидает исключения при попытках изменения коллекции с помощью вызова у обертки методов add(), set(), remove() и т.д. При этом саму коллекцию можно менять, если есть прямой доступ к ней.
jvatechs Уровень 111 Expert
11 августа 2023
у кого не находит класс CollectionUtils: 1) заходим на https://commons.apache.org/proper/commons-collections/download_collections.cgi 2) качаем файлик commons-collections4-X.X-bin.zip (X.X - последняя версия, у меня 4.4 была) в Binaries 3) распаковываете папку в архиве в любое удобное место и добавляете в проект Javarush эту папку в меню Settings > Project Structure > Libraries через плюсик->Java -> месторасположение папки на пк
Дмитрий Уровень 109 Expert
28 января 2024
Спасибо, друг!
Yaroslav Уровень 109 Expert
24 июня 2024
Чёт какое-то сложное колдунство, кому лень:

implementation 'org.apache.commons:commons-collections4:4.5.0-M2'
Сергей Уровень 111 Expert
4 декабря 2022
Капец, 6 попыток на первой задаче, а дело то в импортах import org.apache.commons.collections4.CollectionUtils; Вот что значит не посмотреть комменты перед решением. И никто не фиксит это дело.
Михаил Власов Уровень 108 Expert
14 сентября 2022
Поправка: CollectionUtils.unmodifiableCollection() deprecated. Задачи 1-4 не проходят проверку, потому что в валидаторе стоит импорт import org.apache.commons.collections.CollectionUtils вместо: import org.apache.commons.collections4.CollectionUtils.
Nikita Shamrai Уровень 8 Expert
22 сентября 2022
https://mvnrepository.com/artifact/commons-collections/commons-collections/3.2.1
Артём Уровень 112
30 апреля 2025
На текущий момент исправлено. Стоит import org.apache.commons.collections4.CollectionUtils.