CollectionUtils 소개

많은 유용한 메서드를 포함하는 또 다른 일반 유틸리티 클래스:

addAll(Collection<C> 컬렉션, C...elements) 배열 C의 모든 요소를 ​​컬렉션에 추가합니다.
addIgnoreNull(Collection<T> 컬렉션, T 객체) null이 아닌 경우 요소를 추가합니다.
containsAll(Collection<?> coll1, Collection<?> coll2) collection1이 collection2의 모든 요소를 ​​포함하는지 확인합니다.
containsAny(Collection<?> coll1, Collection<?> coll2) collection1에 collection2의 요소가 하나 이상 포함되어 있는지 확인합니다.
countMatches(Iterable<C> 입력, 술어<? 슈퍼 C> 술어) 컬렉션에서 조건자 규칙을 충족하는 요소 수를 계산합니다.
분리(Iterable<? extends O> a, Iterable<? extends O> b) 둘 다 아닌 하나의 컬렉션에만 있는 개체를 반환합니다.
교차(Iterable<? extends O> a, Iterable<? extends O> b) 한 번에 두 컬렉션의 일부인 개체 컬렉션을 반환합니다.
union(Iterable<? extends O> a, Iterable<? extends O> b) 적어도 하나의 컬렉션에 속하는 개체의 컬렉션을 반환합니다.
빈 컬렉션() 특별한 빈 컬렉션을 반환합니다.
emptyIfNull(컬렉션<T> 컬렉션) collection == null인 경우 빈 컬렉션을 반환합니다.
존재(Iterable<C> 입력, 술어<? 슈퍼 C> 술어) 조건자 규칙을 만족하는 컬렉션에 요소가 있는지 확인합니다.
extractSingleton(컬렉션<E> 컬렉션) 컬렉션의 유일한 요소를 반환합니다.
filter(Iterable<T> 컬렉션, 술어<? 슈퍼 T> 술어) 컬렉션의 요소를 필터링합니다.
find(Iterable<T> 컬렉션, 술어<? 슈퍼 T> 술어) 컬렉션 요소 찾기
isEmpty(컬렉션<?> 콜) 컬렉션이 비어 있는지 확인
isEqualCollection(컬렉션<?> a, 컬렉션<?> b) 컬렉션 비교
isFull(Collection<? extends Object> coll) 컬렉션에 요소를 계속 추가할 수 있는지 확인합니다.
isNotEmpty(컬렉션<?> 콜) 컬렉션이 비어 있지 않은지 확인
isSubCollection(컬렉션<?> a, 컬렉션<?> b) 컬렉션 B가 컬렉션 A에 있는지 확인
matchesAll(Iterable<C> 입력, 술어<? 슈퍼 C> 술어) 컬렉션의 모든 요소가 조건자 규칙을 충족하는지 확인합니다.
removeAll(컬렉션<E> 컬렉션, 컬렉션<?> 제거) 컬렉션의 모든 요소를 ​​제거합니다.
retainAll(Collection<C> 컬렉션, Collection<?> 보유) 보유에도 포함된 컬렉션의 모든 요소를 ​​포함하는 컬렉션을 반환합니다.
reverseArray(객체[] 배열) 배열을 거꾸로 뒤집습니다.
unmodifiableCollection(Collection<? extends 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가지 기본 연산이 집합에 있다는 것을 알 수 있습니다.

이러한 작업을 위해 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]

세트 작업, 계속

이 예제는 위의 네 가지 방법을 사용하여 두 컬렉션으로 작업하는 방법을 보여줍니다.

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() 메서드

때로는 개체의 내부 데이터 컬렉션을 반환해야 하는 인터페이스 메서드를 구현해야 합니다. 그리고 데이터가 내부에 있기 때문에 우리는 누구도 그것을 어딘가에서 변경하는 것을 원하지 않습니다.

또는 변경할 필요가 없지만 일부 타사 메서드에 전달해야 하는 컬렉션을 어딘가에서 받았습니다. 그가 그것을 바꾸지 않을 것이라는 보장은 어디에 있습니까?

평화롭게 잠들기 위해 컬렉션을 수정하려고 할 때 예외를 throw하는 특수 래퍼로 컬렉션을 래핑할 수 있습니다.

예:

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)

실제로 이 메서드는 이미 사용되지 않는 것으로 표시되어 있으며 대신 Collections.unmodifiableCollection(Collection<? extends T> c) 를 사용하는 것이 좋습니다 .

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