Въведение в CollectionUtils
Друг общ клас помощни програми, който съдържа много полезни методи:
addAll(Collection<C> collection, C...elements) | Добавя всички елементи от масив C към колекцията |
addIgnoreNull(колекция<T> колекция, T обект) | Добавя елемент, ако не е нула |
съдържа всички (Колекция<?> кол1, Колекция<?> кол2) | Проверява дали колекция1 съдържа всички елементи на колекция2 |
съдържа Any(Collection<?> coll1, Collection<?> coll2) | Проверява дали колекция1 съдържа поне един елемент от колекция2 |
countMatches(Iterable<C> input, Predicate<? super C> predicate) | Преброява колко елемента в колекция отговарят на правило за предикат |
дизюнкция (Iterable<? разширява O> a, Iterable<? разширява O> b) | Връща обекти, които са само в една колекция, но не и в двете |
пресичане (Iterable<? разширява O> a, Iterable<? разширява O> b) | Връща колекция от обекти, които са част от двете колекции едновременно |
съюз (Iterable<? разширява O> a, Iterable<? разширява O> b) | Връща колекция от обекти, които са част от поне една колекция |
празна колекция() | Връща специална празна колекция |
emptyIfNull(колекция<T>колекция) | Връща празна колекция, ако колекция == null |
съществува (Iterable<C> input, Predicate<? super C> predicate) | Проверява дали в колекцията има елемент, който отговаря на правилото за предикат |
extractSingleton(колекция<E>колекция) | Връща единствения елемент от колекцията |
филтър (Iterable<T> колекция, Predicate<? super T> предикат) | Филтрира елементите на колекция |
find(Iterable<T> колекция, Predicate<? super T> предикат) | Търся елементи от колекция |
isEmpty(Колекция<?>col) | Проверява дали колекцията е празна |
isEqualCollection(Колекция<?> a, Колекция<?> b) | Сравнява колекции |
isFull(Collection<? extends Object> coll) | Проверява дали даден елемент все още може да бъде добавен към колекцията |
isNotEmpty(Колекция<?>col) | Проверете дали колекцията не е празна |
isSubCollection(Колекция<?> a, Колекция<?> b) | Проверява дали колекция B е в колекция A |
matchesAll(Iterable<C> input, Predicate<? super C> predicate) | Проверява дали всички елементи на колекция отговарят на предикатно правило |
removeAll(колекция<E> колекция, колекция<?> премахване) | Премахва всички елементи от колекцията |
retainAll(Collection<C> collection, Collection<?> retain) | Връща колекция, съдържаща всички елементи на колекцията, които също се съдържат в retain |
reverseArray(Object[] масив) | Обръща масив назад |
unmodifiableCollection(Колекция<? разширява C> колекция) | Връща обвивка върху колекцията. Всеки опит за промяна на колекцията ще предизвика изключение. |
Нека да разгледаме някои методи.
Начини за проверка дали дадена колекция е празна
Ето колко лесно е да определите дали дадена колекция е празна:
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
Ръководство за Apache Commons Collections CollectionUtils
Операции върху множества
Ако трябваше да се занимавате с теория на множествата, тогава знаете, че има 4 основни операции върху множества: обединение, пресичане, разлика и дизюнкция.
![](https://cdn.codegym.cc/images/article/33592357-0b07-4f2d-ac05-c336539da1cf/800.jpeg)
За тези операции класът CollectionUtils има 4 метода:
- съюз ()
- пресичане ()
- дизюнкция()
- изваждане ()
По-долу са дадени няколко прости примера:
Асоциация
List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");
//combine two sets
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");
//intersections of two sets
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");
//disjunction
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");
//difference
Collection<String> result = CollectionUtils.subtract(firstList, secondList);
System.out.println(ArrayUtils.toString(result)); // [1, 4, 5]
Операции върху комплекти, продължение
Този пример показва How да използвате горните четири метода за работа с две колекции:
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); // An association
Collection<Integer> intersection = CollectionUtils.intersection(firstList, secondList); // Intersection
Collection<Integer> disjunction = CollectionUtils.disjunction(firstList, secondList); // disjunction
Collection<Integer> subtract = CollectionUtils.subtract(firstList, secondList); // Difference
System.out.println("firstList: " + ArrayUtils.toString(firstList.toArray()));
System.out.println("secondList: " + ArrayUtils.toString(secondList.toArray()));
System.out.println("An association: " + ArrayUtils.toString(union.toArray()));
System.out.println("Intersection: " + ArrayUtils.toString(intersection.toArray()));
System.out.println("Disjunction: " + ArrayUtils.toString(disjunction.toArray()));
System.out.println("Difference: " + ArrayUtils.toString(subtract.toArray()));
Нашият резултат:
firstList: {1,2,3,3,4,5}
secondList: {3,4,4,5,6,7}
An association: {1,2,3,3,4,4,5,6,7}
intersection: {3,4,5}
Disjunction: {1,2,3,4,6,7}
Difference: {1,2,3}
Можете да експериментирате с тези методи сами.
метод unmodifiableCollection().
Понякога трябва да внедрим интерфейсни методи, които трябва да върнат колекции от вътрешни данни на нашите обекти. И тъй като данните са вътрешни, не искаме някой да ги променя някъде.
Или сме получor някъде колекция, която не трябва да се променя, но е принудена да я предаде на няHowъв метод на трета страна. Къде е гаранцията, че няма да го смени?
За да спи спокойно, колекцията може да бъде опакована в специална обвивка, която ще хвърли изключение при опит за промяна на колекцията.
Пример:
Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection = Collections.unmodifiableCollection(firstCollection);
firstCollection.add("hello");
firstCollection.add("from");
firstCollection.add("codeGym");
//secondCollection.add("have a error");
System.out.println(secondCollection); //[hello, from, codeGym]
Методът Collections.unmodifiableCollection() връща обвивка върху предадената му колекция. Ако извикате неговите методи get() , size() , тогава всичко ще работи. Въпреки това, когато извиквате методите add() , set() , remove() , ще получите изключение.
java.lang.UnsupportedOperationException
at org.apache.commons.collections.collection.UnmodifiableCollection.add(UnmodifiableCollection.java:75)
Всъщност методът вече е маркиран като остарял и се препоръчва instead of него да се използва Collections.unmodifiableCollection(Collection<? extends T> c) .
Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);