Pengenalan kepada CollectionUtils

Satu lagi kelas utiliti generik yang mengandungi banyak kaedah berguna:

addAll(Koleksi<C> koleksi, C...elemen) Menambah semua elemen tatasusunan C pada koleksi
addIgnoreNull(Koleksi<T> koleksi, objek T) Menambah elemen jika ia bukan nol
mengandungiSemua(Koleksi<?> coll1, Koleksi<?> coll2) Semak bahawa koleksi1 mengandungi semua elemen koleksi2
mengandungi Mana-mana(Koleksi<?> coll1, Koleksi<?> coll2) Semak bahawa collection1 mengandungi sekurang-kurangnya satu elemen daripada collection2
countMatches(Iterable<C> input, Predikat<? super C> predikat) Mengira bilangan elemen dalam koleksi yang memenuhi peraturan predikat
disjunction(Iterable<? extends O> a, Iterable<? extends O> b) Mengembalikan objek yang hanya dalam satu koleksi, tetapi bukan kedua-duanya
persimpangan(Iterable<? memanjang O> a, Iterable<? memanjang O> b) Mengembalikan koleksi objek yang merupakan sebahagian daripada kedua-dua koleksi sekaligus
kesatuan(Iterable<? extends O> a, Iterable<? extends O> b) Mengembalikan koleksi objek yang merupakan sebahagian daripada sekurang-kurangnya satu koleksi
emptyCollection() Mengembalikan koleksi kosong khas
emptyIfNull(Koleksi<T> koleksi) Mengembalikan koleksi kosong jika koleksi == null
wujud(Iterable<C> input, Predicate<? super C> predikat) Menyemak sama ada terdapat unsur dalam koleksi yang memenuhi peraturan predikat
extractSingleton(Koleksi<E> koleksi) Mengembalikan satu-satunya elemen koleksi
penapis(Iterable<T> koleksi, Predikat<? super T> predikat) Menapis elemen koleksi
find(Iterable<T> koleksi, Predikat<? super T> predikat) Mencari elemen koleksi
isEmpty(Collection<?> coll) Menyemak sama ada koleksi kosong
isEqualCollection(Koleksi<?> a, Koleksi<?> b) Membandingkan koleksi
isFull(Collection<? extends Object> coll) Menyemak sama ada elemen masih boleh ditambahkan pada koleksi
isNotEmpty(Collection<?> coll) Semak jika koleksi tidak kosong
isSubCollection(Koleksi<?> a, Koleksi<?> b) Semak sama ada koleksi B ada dalam koleksi A
matchesAll(Iterable<C> input, Predikat<? super C> predikat) Semak bahawa semua elemen koleksi memenuhi peraturan predikat
removeAll(Koleksi<E> koleksi, Koleksi<?> alih keluar) Mengalih keluar semua elemen koleksi
retainAll(Koleksi<C> koleksi, Koleksi<?> kekalkan) Mengembalikan koleksi yang mengandungi semua elemen koleksi yang turut terkandung dalam simpan
reverseArray(Objek[] tatasusunan) Membalikkan tatasusunan ke belakang
unmodifiableCollection(Collection<? melanjutkan koleksi C>) Mengembalikan pembalut pada koleksi. Sebarang percubaan untuk mengubah suai koleksi akan memberikan pengecualian.

Mari lihat beberapa kaedah.

Cara untuk menyemak sama ada koleksi kosong

Begini cara mudah untuk menentukan sama ada koleksi kosong:

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

Semudah itu untuk menyemak bahawa 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 Apache Commons Collections CollectionUtils

Operasi pada set

Jika anda terpaksa berurusan dengan teori set, maka anda tahu bahawa terdapat 4 operasi asas pada set: kesatuan, persilangan, perbezaan dan pemecahan.

Untuk operasi ini, kelas CollectionUtils mempunyai 4 kaedah:

  • kesatuan()
  • persimpangan()
  • disjunction()
  • tolak()

Di bawah adalah beberapa contoh mudah:

Sebuah persatuan

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]

Disjunction

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]

Perbezaan (potongan)

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, diteruskan

Contoh ini menunjukkan cara menggunakan empat kaedah 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()));

Keputusan 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 boleh mencuba kaedah ini sendiri.

Kaedah unmodifiableCollection().

Kadangkala kita perlu melaksanakan kaedah antara muka yang perlu mengembalikan koleksi data dalaman objek kita. Dan kerana data adalah dalaman, kami tidak mahu sesiapa mengubahnya di suatu tempat.

Atau kami telah menerima koleksi yang tidak perlu ditukar di suatu tempat, tetapi terpaksa menyerahkannya kepada beberapa kaedah pihak ketiga. Di manakah jaminan bahawa dia tidak akan mengubahnya?

Untuk tidur dengan tenang, koleksi boleh dibalut dengan pembungkus khas yang akan memberikan pengecualian apabila cuba mengubah suai 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]

Kaedah Collections.unmodifiableCollection() mengembalikan pembalut ke atas koleksi yang dihantar kepadanya. Jika anda memanggil kaedah get() , size() , maka semuanya akan berfungsi. Walau bagaimanapun, apabila memanggil kaedah add() , set() , remove() , anda akan mendapat pengecualian.

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

Malah, kaedah tersebut telah ditandakan sebagai tidak digunakan dan disyorkan untuk menggunakan Collections.unmodifiableCollection(Collection<? extends T> c) sebaliknya .

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