Giới thiệu về CollectionUtils
Một lớp tiện ích chung khác chứa nhiều phương thức hữu ích:
addAll(Bộ sưu tập<C> bộ sưu tập, C...elements) | Thêm tất cả các phần tử của mảng C vào bộ sưu tập |
addIgnoreNull(Bộ sưu tập<T> bộ sưu tập, đối tượng T) | Thêm một phần tử nếu nó không phải là null |
chứaTất cả (Bộ sưu tập <?> coll1, Bộ sưu tập <?> coll2) | Kiểm tra xem bộ sưu tập1 có chứa tất cả các phần tử của bộ sưu tập2 không |
chứaAny(Bộ sưu tập<?> coll1, Bộ sưu tập<?> coll2) | Kiểm tra xem bộ sưu tập1 có chứa ít nhất một phần tử từ bộ sưu tập2 không |
countMatches(Iterable<C> input, Predicate<? super C> predicate) | Đếm xem có bao nhiêu phần tử trong một tập hợp thỏa mãn quy tắc vị từ |
phân tách (Có thể lặp lại <? mở rộng O> a, Có thể lặp lại <? mở rộng O> b) | Trả về các đối tượng chỉ trong một bộ sưu tập, nhưng không phải cả hai |
giao lộ (Có thể lặp lại <? mở rộng O> a, Có thể lặp lại <? mở rộng O> b) | Trả về một tập hợp các đối tượng là một phần của cả hai bộ sưu tập cùng một lúc |
union(Có thể lặp lại<? mở rộng O> a, Có thể lặp lại<? mở rộng O> b) | Trả về một tập hợp các đối tượng là một phần của ít nhất một bộ sưu tập |
bộ sưu tập rỗng() | Trả về một bộ sưu tập rỗng đặc biệt |
emptyIfNull(Bộ sưu tập<T> bộ sưu tập) | Trả về một bộ sưu tập trống nếu bộ sưu tập == null |
tồn tại (Iterable<C> input, Predicate<? super C> predicate) | Kiểm tra xem có phần tử nào trong tập hợp thỏa mãn quy tắc vị ngữ không |
extractSingleton(Bộ sưu tập<E> bộ sưu tập) | Trả về phần tử duy nhất của bộ sưu tập |
bộ lọc (Iterable<T> collection, Predicate<? super T> predicate) | Lọc các phần tử của một bộ sưu tập |
find(Iterable<T> collection, Predicate<? super T> predicate) | Tìm kiếm các phần tử của một tập hợp |
isEmpty(Bộ sưu tập <?> coll) | Kiểm tra xem bộ sưu tập có trống không |
isEqualCollection(Bộ sưu tập<?> a, Bộ sưu tập<?> b) | So sánh các bộ sưu tập |
isFull(Bộ sưu tập <? mở rộng đối tượng> coll) | Kiểm tra xem một phần tử vẫn có thể được thêm vào bộ sưu tập |
isNotEmpty(Bộ sưu tập <?> coll) | Kiểm tra xem bộ sưu tập có trống không |
isSubCollection(Bộ sưu tập<?> a, Bộ sưu tập<?> b) | Kiểm tra xem bộ sưu tập B có trong bộ sưu tập A không |
MatchAll(Iterable<C> input, Predicate<? super C> predicate) | Kiểm tra xem tất cả các phần tử của tập hợp có thỏa mãn quy tắc vị ngữ không |
removeAll(Bộ sưu tập<E> bộ sưu tập, Bộ sưu tập<?> xóa) | Loại bỏ tất cả các yếu tố của bộ sưu tập |
giữ lại Tất cả (Bộ sưu tập <C> bộ sưu tập, Bộ sưu tập <?> giữ lại) | Trả về một bộ sưu tập chứa tất cả các phần tử của bộ sưu tập cũng được chứa trong phần giữ lại |
ReverseArray(Đối tượng[] mảng) | Đảo ngược một mảng về phía sau |
unmodifiableCollection(Collection<? extends C> collection) | Trả về một trình bao bọc trên bộ sưu tập. Mọi nỗ lực sửa đổi bộ sưu tập sẽ tạo ra một ngoại lệ. |
Hãy xem xét một số phương pháp.
Các cách để kiểm tra xem một bộ sưu tập có trống không
Đây là cách dễ dàng để xác định xem một bộ sưu tập có trống không:
CollectionUtils.isEmpty(null); // true
CollectionUtils.isEmpty(new LinkedList<>()); // true
CollectionUtils.isEmpty(Collections.singleton(new int[]{2, 1})); // false
Thật dễ dàng để kiểm tra xem một bộ sưu tập có trống không:
CollectionUtils.isNotEmpty(null); // false
CollectionUtils.isNotEmpty(new LinkedList<>()); // false
CollectionUtils.isNotEmpty(Collections.singleton(new int[]{2, 1})); // true
Ví dụ:
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
Hướng dẫn về Bộ sưu tập Apache Commons CollectionUtils
Các phép toán trên tập hợp
Nếu bạn phải làm việc với lý thuyết tập hợp, thì bạn biết rằng có 4 phép toán cơ bản trên tập hợp: hợp, giao, hiệu và tách.
![](https://cdn.codegym.cc/images/article/33592357-0b07-4f2d-ac05-c336539da1cf/800.jpeg)
Đối với các thao tác này, lớp CollectionUtils có 4 phương thức:
- liên hiệp()
- ngã tư()
- phân ly()
- trừ ()
Dưới đây là một số ví dụ đơn giản:
một hiệp hội
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]
ngã tư
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]
Phân ly
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]
Chênh lệch (khấu trừ)
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]
Các phép toán trên tập hợp, tiếp tục
Ví dụ này cho thấy cách sử dụng bốn phương pháp trên để làm việc với hai bộ sưu tập:
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()));
Kết quả của chúng tôi:
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}
Bạn có thể tự mình thử nghiệm các phương pháp này.
Phương thức unmodifiableCollection()
Đôi khi chúng ta cần triển khai các phương thức giao diện cần trả về các bộ sưu tập dữ liệu nội bộ của các đối tượng của chúng ta. Và vì dữ liệu là nội bộ nên chúng tôi không muốn bất kỳ ai thay đổi nó ở đâu đó.
Hoặc chúng tôi đã nhận được ở đâu đó một bộ sưu tập không cần thay đổi nhưng buộc phải chuyển nó cho một số phương thức của bên thứ ba. Đâu là sự đảm bảo rằng anh ấy sẽ không thay đổi nó?
Để ngủ yên, bộ sưu tập có thể được bọc trong một trình bao bọc đặc biệt sẽ đưa ra một ngoại lệ khi cố gắng sửa đổi bộ sưu tập.
Ví dụ:
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]
Phương thức Collections.unmodifiableCollection() trả về một trình bao bọc trên bộ sưu tập được truyền cho nó. Nếu bạn gọi các phương thức get() , size() của nó thì mọi thứ sẽ hoạt động. Tuy nhiên, khi gọi các phương thức add() , set() , remove() , bạn sẽ gặp một ngoại lệ.
java.lang.UnsupportedOperationException
at org.apache.commons.collections.collection.UnmodifiableCollection.add(UnmodifiableCollection.java:75)
Trên thực tế, phương pháp này đã được đánh dấu là không dùng nữa và bạn nên sử dụng Collections.unmodifiableCollection(Collection<? extends T> c) thay thế .
Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);