Apache Commons Collections CollectionUtils指南

1.概述

簡而言之, Apache CollectionUtils提供了用於常見操作的實用程序方法,這些方法涵蓋了廣泛的用例,並有助於避免編寫樣板代碼。該庫針對較早的JVM版本,因為當前Java 8的Stream API提供了類似的功能。

2. Maven依賴

我們需要添加以下依賴項才能使用CollectionUtils:

<dependency>

 <groupId>org.apache.commons</groupId>

 <artifactId>commons-collections4</artifactId>

 <version>4.1</version>

 </dependency>

可在此處找到該庫的最新版本。

3.設定

讓我們添加CustomerAddress類:

public class Customer {

 private Integer id;

 private String name;

 private Address address;



 // standard getters and setters

 }



 public class Address {

 private String locality;

 private String city;



 // standard getters and setters

 }

我們還將方便地準備以下客戶列表實例,以測試我們的實現:

Customer customer1 = new Customer(1, "Daniel", "locality1", "city1");

 Customer customer2 = new Customer(2, "Fredrik", "locality2", "city2");

 Customer customer3 = new Customer(3, "Kyle", "locality3", "city3");

 Customer customer4 = new Customer(4, "Bob", "locality4", "city4");

 Customer customer5 = new Customer(5, "Cat", "locality5", "city5");

 Customer customer6 = new Customer(6, "John", "locality6", "city6");



 List<Customer> list1 = Arrays.asList(customer1, customer2, customer3);

 List<Customer> list2 = Arrays.asList(customer4, customer5, customer6);

 List<Customer> list3 = Arrays.asList(customer1, customer2);



 List<Customer> linkedList1 = new LinkedList<>(list1);

4. CollectionUtils

讓我們看一下Apache Commons CollectionUtils類中一些最常用的方法。

4.1。僅添加非null元素

我們可以使用CollectionUtils的addIgnoreNull方法將非空元素僅添加到提供的集合中。

此方法的第一個參數是我們要向其中添加元素的集合,第二個參數是我們要向其添加元素的集合:

@Test

 public void givenList_whenAddIgnoreNull_thenNoNullAdded() {

 CollectionUtils.addIgnoreNull(list1, null);



 assertFalse(list1.contains(null));

 }

請注意,沒有將null添加到列表中。

4.2。整理List

我們可以使用collate方法來整理兩個已經排序的列表。此方法將我們要合併的兩個列表作為參數,並返回一個排序列表:

@Test

 public void givenTwoSortedLists_whenCollated_thenSorted() {

 List<Customer> sortedList = CollectionUtils.collate(list1, list2);



 assertEquals(6, sortedList.size());

 assertTrue(sortedList.get(0).getName().equals("Bob"));

 assertTrue(sortedList.get(2).getName().equals("Daniel"));

 }

4.3。轉換物件

我們可以使用transform方法將A類的對象轉換為B類的不同對象。此方法將A類的對象列表和一個轉換器作為參數。

此操作的結果是類B的對象的列表:

@Test

 public void givenListOfCustomers_whenTransformed_thenListOfAddress() {

 Collection<Address> addressCol = CollectionUtils.collect(list1,

 new Transformer<Customer, Address>() {

 public Address transform(Customer customer) {

 return customer.getAddress();

 }

 });



 List<Address> addressList = new ArrayList<>(addressCol);

 assertTrue(addressList.size() == 3);

 assertTrue(addressList.get(0).getLocality().equals("locality1"));

 }

4.4。過濾對象

使用過濾器,我們可以從列表中刪除不滿足給定條件的對象****該方法將列表作為第一個參數,並將謂詞作為第二個參數。

filterInverse方法執行相反的操作。謂詞返回true時,它將從列表中刪除對象。

如果修改了輸入列表,即如果從列表中過濾出至少一個對象,則filterfilterInverse均返回true

@Test

 public void givenCustomerList_WhenFiltered_thenCorrectSize() {



 boolean isModified = CollectionUtils.filter(linkedList1,

 new Predicate<Customer>() {

 public boolean evaluate(Customer customer) {

 return Arrays.asList("Daniel","Kyle").contains(customer.getName());

 }

 });



 assertTrue(linkedList1.size() == 2);

 }

如果要返回結果列表而不是布爾標誌,則可以使用*select**selectRejected*** 。

4.5。檢查非空

當我們要檢查列表中是否至少有一個元素時,isNotEmpty方法非常方便。另一種檢查方法是:

boolean isNotEmpty = (list != null && list.size() > 0);

儘管上面的代碼行做了相同的事情,但是CollectionUtils.isNotEmpty使我們的代碼更整潔:

@Test

 public void givenNonEmptyList_whenCheckedIsNotEmpty_thenTrue() {

 assertTrue(CollectionUtils.isNotEmpty(list1));

 }

isEmpty則相反。它檢查給定列表是否為空或列表中是否有零個元素:

List<Customer> emptyList = new ArrayList<>();

 List<Customer> nullList = null;



 assertTrue(CollectionUtils.isEmpty(nullList));

 assertTrue(CollectionUtils.isEmpty(emptyList));

4.6。檢查包含

我們可以使用isSubCollection來檢查一個集合是否包含在另一個集合中。 isSubCollection以兩個集合作為參數,如果第一個集合是第二個集合的子集合,則返回true

@Test

 public void givenCustomerListAndASubcollection_whenChecked_thenTrue() {

 assertTrue(CollectionUtils.isSubCollection(list3, list1));

 }

如果對像在第一個集合中出現的次數小於或等於它在第二個集合中出現的次數,則該集合是另一個集合的子集合。

4.7。集合的交集

我們可以使用CollectionUtils.intersection方法獲取兩個集合的交集。此方法採用兩個集合,並返回在兩個輸入集合中相同的元素的集合:

@Test

 public void givenTwoLists_whenIntersected_thenCheckSize() {

 Collection<Customer> intersection = CollectionUtils.intersection(list1, list3);

 assertTrue(intersection.size() == 2);

 }

元素在結果集合中出現的次數是該元素在每個給定集合中出現的次數的最小值。

4.8。Collection減法

CollectionUtils.subtract將兩個集合作為輸入,並返回一個集合,該集合包含第一個集合中存在但第二個集合中不存在的元素:

@Test

 public void givenTwoLists_whenSubtracted_thenCheckElementNotPresentInA() {

 Collection<Customer> result = CollectionUtils.subtract(list1, list3);

 assertFalse(result.contains(customer1));

 }

結果中發生收集的次數是在第一個收集中發生的次數減去在第二個收集中發生的次數。

4.9。集合的並集

CollectionUtils.union進行兩個集合的並集,並返回一個集合,其中包含第一個或第二個集合中存在的所有元素。

@Test

 public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() {

 Collection<Customer> union = CollectionUtils.union(list1, list2);



 assertTrue(union.contains(customer1));

 assertTrue(union.contains(customer4));

 }

元素在結果集合中出現的次數是該元素在每個給定集合中出現的次數的最大值。

5.結論

我們完成了。

我們介紹了CollectionUtils的一些常用方法-當我們在Java項目中使用集合時,這對於避免樣板非常有用。

和往常一樣,該代碼可在GitHub上獲得。