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.

Đố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);