รู้เบื้องต้นเกี่ยวกับ CollectionUtils
คลาสยูทิลิตี้ทั่วไปอื่นที่มีเมธอดที่มีประโยชน์มากมาย:
addAll (คอลเลกชัน <C> คอลเลกชัน C...องค์ประกอบ) | เพิ่มองค์ประกอบทั้งหมดของอาร์เรย์ C ลงในคอลเลกชัน |
addIgnoreNull (คอลเลกชัน <T> คอลเลกชัน วัตถุ T) | เพิ่มองค์ประกอบหากไม่เป็นโมฆะ |
มีทั้งหมด (Collection<?> coll1, Collection<?> coll2) | ตรวจสอบว่า collection1 มีองค์ประกอบทั้งหมดของ collection2 |
มีใดๆ (Collection<?> coll1, Collection<?> coll2) | ตรวจสอบว่า collection1 มีองค์ประกอบอย่างน้อยหนึ่งรายการจาก collection2 |
countMatches (อินพุต Iterable <C> เพรดิเคต <? super C> เพรดิเคต) | นับจำนวนองค์ประกอบในคอลเลกชันที่เป็นไปตามกฎเพรดิเคต |
การแยก (Iterable<? ขยาย O> a, Iterable<? ขยาย O> b) | ส่งกลับวัตถุที่อยู่ในคอลเลกชันเดียว แต่ไม่ใช่ทั้งสองอย่าง |
ทางแยก(Iterable<? ขยาย O> a, Iterable<? ขยาย O> b) | ส่งกลับคอลเลกชันของวัตถุที่เป็นส่วนหนึ่งของทั้งสองคอลเลกชันพร้อมกัน |
ยูเนี่ยน (Iterable<? ขยาย O> a, Iterable<? ขยาย O> b) | ส่งกลับคอลเลกชันของวัตถุที่เป็นส่วนหนึ่งของคอลเลกชันอย่างน้อยหนึ่ง |
คอลเลกชันที่ว่างเปล่า () | ส่งกลับคอลเลกชันพิเศษที่ว่างเปล่า |
emptyIfNull(คอลเลกชัน <T> คอลเลกชัน) | ส่งคืนคอลเลกชันที่ว่างเปล่าหากคอลเลกชัน == null |
มีอยู่ (อินพุต Iterable <C> เพรดิเคต <? super C> เพรดิเคต) | ตรวจสอบว่ามีองค์ประกอบในคอลเล็กชันที่เป็นไปตามกฎเพรดิเคตหรือไม่ |
extractSingleton (คอลเลกชัน <E> คอลเลกชัน) | ส่งกลับองค์ประกอบเดียวของคอลเลกชัน |
ตัวกรอง (ชุด Iterable<T> เพรดิเคต<? super T> เพรดิเคต) | กรององค์ประกอบของคอลเลกชัน |
ค้นหา (คอลเลกชัน Iterable<T> เพรดิเคต<? super T> เพรดิเคต) | กำลังมองหาองค์ประกอบของคอลเลกชัน |
isEmpty(คอลเลกชัน<?> คอล) | ตรวจสอบว่าคอลเลกชันว่างเปล่าหรือไม่ |
isEqualCollection(คอลเลกชั่น<?> ก, คอลเลกชั่น<?> ข) | เปรียบเทียบคอลเลกชัน |
isFull (คอลเลกชัน <? ขยาย Object> coll) | ตรวจสอบว่ายังสามารถเพิ่มองค์ประกอบในคอลเลกชันได้หรือไม่ |
isNotEmpty(คอลเลกชัน<?> คอล) | ตรวจสอบว่าคอลเลกชันไม่ว่างเปล่า |
isSubCollection(คอลเลกชั่น<?> ก, คอลเลกชั่น<?> ข) | ตรวจสอบว่าคอลเลกชัน B อยู่ในคอลเลกชัน A หรือไม่ |
จับคู่ทั้งหมด (อินพุต Iterable <C> เพรดิเคต <? super C> เพรดิเคต) | ตรวจสอบว่าองค์ประกอบทั้งหมดของคอลเลกชันเป็นไปตามกฎเพรดิเคต |
removeAll(คอลเล็กชัน<E> คอลเล็กชัน คอลเล็กชัน<?> ลบ) | ลบองค์ประกอบทั้งหมดของคอลเลกชัน |
เก็บทั้งหมด (คอลเล็กชัน <C> คอลเล็กชัน คอลเล็กชัน <?> เก็บ) | ส่งกลับคอลเลกชันที่มีองค์ประกอบทั้งหมดของคอลเลกชันที่มีอยู่ในการเก็บรักษา |
reverseArray(วัตถุ[] อาร์เรย์) | ย้อนกลับอาร์เรย์ย้อนกลับ |
unmodifiableCollection (คอลเลกชัน <? ขยาย 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() เมธอด
บางครั้งเราจำเป็นต้องใช้วิธีอินเทอร์เฟซที่ต้องส่งคืนคอลเล็กชันข้อมูลภายในของอ็อบเจ็กต์ของเรา และเนื่องจากข้อมูลเป็นข้อมูลภายใน เราจึงไม่ต้องการให้ใครมาเปลี่ยนแปลงข้อมูลในที่ใดที่หนึ่ง
หรือเราได้รับคอลเล็กชันที่ไม่จำเป็นต้องเปลี่ยนแปลงที่ไหนสักแห่ง แต่ถูกบังคับให้ส่งต่อไปยังวิธีการของบุคคลที่สาม ที่ไหนรับประกันว่าเขาจะไม่เปลี่ยนให้?
เพื่อให้นอนหลับอย่างสงบ คอลเลกชันสามารถห่อด้วยกระดาษห่อพิเศษซึ่งจะทำให้เกิดข้อยกเว้นเมื่อพยายามแก้ไขคอลเลกชัน
ตัวอย่าง:
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()ส่งคืน wrapper เหนือคอลเล็กชันที่ส่งไป หากคุณเรียกใช้เมธอด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);
GO TO FULL VERSION