JavaRush /Kurslar /All lectures for UZ purposes /Apache Commons'дан CollectionUtils класи

Apache Commons'дан CollectionUtils класи

All lectures for UZ purposes
Daraja, Dars
Mavjud

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) Коллексия == 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) Коллексия устидан wrapper қайтаради. Коллексияни ўзгартиришга уриниш истиснога олиб келади.

Айрим методларни кўриб чиқамиз.

Коллексия буш эканлигини текшириш усуллари

Коллексия буш эканлигини аниқлаш қанчалик осон эканини кўринг:


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 class 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()

Баъзан интерфейс методларини ишга оширишимиз керак, у ерда объектларимизнинг ички маълумотларини ўз ичига олган коллексияларни қайтариш керак бўлади. Ва чунки маълумотлар ички, биз уларни кимдир бир жойда ўзгартирганни истамаймиз.

Ёки бирор жойда ўзгартириш мумкин бўлмаган коллексия олиб, уни бирор ташқи методга беришимиз керак бўлади. Унга ишонч қайси, у уни ўзгартирмайди?

Тинч уйқуда бўлиш учун, коллексияни уни ўзгартиришга уринишда истисно чиқарадиган махсус ўрамага олиб қўйиш мумкин.

Мисол:


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() унга берилган коллексия устидан wrapper қайтаради. Агар унга get(), size() методларини чақирса, ҳамма нарса ишлайди. Бироқ, add(), set(), remove() методларини чақирганда, ты истисно оласан.

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

Аслида, бу метод аллақачон deprecation билан белгиланган ва унинг ўрнига Collections.unmodifiableCollection(Collection<? extends T> c) ишлатиш тавсия қилинади.


Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION