Pengantar CollectionUtils

Kelas utilitas generik lain yang berisi banyak metode berguna:

addAll(Collection<C> collection, C...elements) Menambahkan semua elemen array C ke koleksi
addIgnoreNull(Koleksi<T> koleksi, objek T) Menambahkan elemen jika bukan nol
berisiSemua(Koleksi<?> coll1, Koleksi<?> coll2) Periksa apakah collection1 berisi semua elemen collection2
berisiAny(Koleksi<?> coll1, Koleksi<?> coll2) Periksa apakah collection1 berisi setidaknya satu elemen dari collection2
countMatches(Iterable<C> input, Predikat<? super C> predikat) Menghitung berapa banyak elemen dalam koleksi yang memenuhi aturan predikat
disjungsi(Iterable<? meluas O> a, Iterable<? meluas O> b) Mengembalikan objek yang hanya ada dalam satu koleksi, tetapi tidak keduanya
persimpangan(Iterable<? meluas O> a, Iterable<? meluas O> b) Mengembalikan koleksi objek yang merupakan bagian dari kedua koleksi sekaligus
serikat(Iterable<? meluas O> a, Iterable<? meluas O> b) Mengembalikan koleksi objek yang merupakan bagian dari setidaknya satu koleksi
koleksikosong() Mengembalikan koleksi kosong khusus
emptyIfNull(Koleksi<T> koleksi) Mengembalikan koleksi kosong jika koleksi == null
ada(Iterable<C> input, Predikat<? super C> predikat) Memeriksa apakah ada elemen dalam koleksi yang memenuhi aturan predikat
extractSingleton(Koleksi<E> koleksi) Mengembalikan satu-satunya elemen dari koleksi
filter(Koleksi Iterable<T>, Predikat<? super T> predikat) Memfilter elemen koleksi
find(Koleksi Iterable<T>, Predikat<? super T> predikat) Mencari elemen koleksi
isEmpty(Koleksi<?> coll) Memeriksa apakah koleksinya kosong
isEqualCollection(Koleksi<?> a, Koleksi<?> b) Membandingkan koleksi
isFull(Koleksi<? extends Object> coll) Memeriksa apakah suatu elemen masih dapat ditambahkan ke koleksi
isNotEmpty(Koleksi<?> coll) Periksa apakah koleksinya tidak kosong
isSubCollection(Koleksi<?> a, Koleksi<?> b) Memeriksa apakah koleksi B ada di koleksi A
matchAll(Iterable<C> input, Predikat<? super C> predikat) Memeriksa bahwa semua elemen koleksi memenuhi aturan predikat
hapusSemua(Koleksi<E> koleksi, Koleksi<?> hapus) Menghapus semua elemen koleksi
retainAll(Koleksi<C> koleksi, Koleksi<?> pertahankan) Mengembalikan koleksi yang berisi semua elemen koleksi yang juga terkandung dalam penyimpanan
reverseArray(Objek[] array) Membalikkan array mundur
unmodifiableCollection(Collection<? extends C> collection) Mengembalikan pembungkus di atas koleksi. Setiap upaya untuk memodifikasi koleksi akan menimbulkan pengecualian.

Mari kita lihat beberapa metode.

Cara untuk memeriksa apakah koleksi kosong

Inilah betapa mudahnya menentukan apakah suatu koleksi kosong:

CollectionUtils.isEmpty(null); // true
CollectionUtils.isEmpty(new LinkedList<>()); // true
CollectionUtils.isEmpty(Collections.singleton(new int[]{2, 1})); // false

Sama mudahnya untuk memeriksa bahwa koleksi tidak kosong:

CollectionUtils.isNotEmpty(null); // false
CollectionUtils.isNotEmpty(new LinkedList<>()); // false
CollectionUtils.isNotEmpty(Collections.singleton(new int[]{2, 1})); // true

Contoh:

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

Panduan untuk Koleksi Apache Commons CollectionUtils

Operasi pada set

Jika Anda harus berurusan dengan teori himpunan, maka Anda tahu bahwa ada 4 operasi dasar pada himpunan: penyatuan, irisan, selisih, dan disjungsi.

Untuk operasi ini, kelas CollectionUtils memiliki 4 metode:

  • Persatuan()
  • persimpangan()
  • pemisahan()
  • mengurangi()

Di bawah ini adalah beberapa contoh sederhana:

Sebuah asosiasi

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]

persimpangan

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]

Pemisahan

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]

Selisih (pengurangan)

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]

Operasi pada set, lanjutan

Contoh ini menunjukkan cara menggunakan empat metode di atas untuk bekerja dengan dua koleksi:

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

Hasil kami:

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}

Anda dapat bereksperimen dengan metode ini sendiri.

unmodifiableCollection() Metode

Terkadang kita perlu mengimplementasikan metode antarmuka yang perlu mengembalikan kumpulan data internal objek kita. Dan karena datanya internal, kami tidak ingin siapa pun mengubahnya di suatu tempat.

Atau kami telah menerima koleksi di suatu tempat yang tidak perlu diubah, tetapi dipaksa untuk meneruskannya ke beberapa metode pihak ketiga. Di manakah jaminan bahwa dia tidak akan mengubahnya?

Untuk tidur nyenyak, koleksi dapat dibungkus dengan pembungkus khusus yang akan mengeluarkan pengecualian saat mencoba memodifikasi koleksi.

Contoh:

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]

Metode Collections.unmodifiableCollection() mengembalikan pembungkus atas koleksi yang diteruskan ke sana. Jika Anda memanggil metode get() , size() , maka semuanya akan berfungsi. Namun, saat memanggil metode add() , set() , remove() , Anda akan mendapatkan pengecualian.

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

Faktanya, metode ini sudah ditandai sebagai usang dan disarankan untuk menggunakan Collections.unmodifiableCollection(Collection<? extends T> c) sebagai gantinya .

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