1. 概要

簡単に言えば、 Apache CollectionUtils は、幅広いユースケースをカバーする一般的な操作のユーティリティメソッドを提供し、ボイラープレートコードの記述を回避するのに役立ちます。 現在、同様の機能がJava8のStream APIによって提供されているため、ライブラリは古いJVMリリースを対象としています。

2. Mavenの依存関係

CollectionUtilsを使用するには、次の依存関係を追加する必要があります:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

ライブラリの最新バージョンはここにあります。

3. 設定

顧客アドレスクラスを追加しましょう:

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 CommonsCollectionUtilsクラスで最もよく使用されるメソッドのいくつかを見ていきましょう。

4.1. ヌル以外の要素のみを追加する

CollectionUtilsのaddIgnoreNullメソッドを使用して、提供されたコレクションにnull以外の要素のみを追加できます。

このメソッドの最初の引数は、要素を追加するコレクションであり、2番目の引数は、追加する要素です。

@Test
public void givenList_whenAddIgnoreNull_thenNoNullAdded() {
    CollectionUtils.addIgnoreNull(list1, null);
 
    assertFalse(list1.contains(null));
}

nullがリストに追加されていないことに注意してください。

4.2. 照合リスト

collateメソッドを使用して、すでに並べ替えられた2つのリストを照合できます。このメソッドは、マージする両方のリストを引数として取り、単一の並べ替えられたリストを返します。

@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. オブジェクトのフィルタリング

フィルタを使用して、特定の条件を満たすオブジェクトをリストから削除できますこのメソッドは、リストを最初の引数として取り、 述語その2番目の引数として。

filterInverseメソッドは逆の動作をします。述語がtrueを返すと、リストからオブジェクトを削除します。

filterfilterInverseはどちらも、入力リストが変更された場合、trueを返します。 少なくとも1つのオブジェクトがリストから除外された場合:

@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メソッドは、リストに少なくとも1つの要素があるかどうかを確認する場合に非常に便利です。同じことを確認する別の方法は次のとおりです。

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

上記のコード行は同じことをしますが、CollectionUtils.isNotEmptyはコードをよりクリーンに保ちます。

@Test
public void givenNonEmptyList_whenCheckedIsNotEmpty_thenTrue() {
    assertTrue(CollectionUtils.isNotEmpty(list1));
}

isEmptyは反対のことをします。指定されたリストがnullであるか、リストにゼロの要素があるかどうかをチェックします。

List<Customer> emptyList = new ArrayList<>();
List<Customer> nullList = null;
 
assertTrue(CollectionUtils.isEmpty(nullList));
assertTrue(CollectionUtils.isEmpty(emptyList));

4.6. 包含の確認

isSubCollection を使用して、コレクションが別のコレクションに含まれているかどうかを確認できます。 isSubCollection は、引数として2つのコレクションを取り、最初のコレクションが2番目のコレクションのサブコレクションである場合はtrueを返します。

@Test
public void givenCustomerListAndASubcollection_whenChecked_thenTrue() {
    assertTrue(CollectionUtils.isSubCollection(list3, list1));
}

オブジェクトが最初のコレクションで発生する回数が2番目のコレクションで発生する回数以下の場合、コレクションは別のコレクションのサブコレクションです。

4.7. コレクションの交差点

CollectionUtils.intersectionメソッドを使用して、2つのコレクションの共通部分を取得できます。このメソッドは、2つのコレクションを受け取り、両方の入力コレクションに共通の要素のコレクションを返します。

@Test
public void givenTwoLists_whenIntersected_thenCheckSize() {
    Collection<Customer> intersection = CollectionUtils.intersection(list1, list3);
    assertTrue(intersection.size() == 2);
}

結果のコレクションで要素が発生する回数は、指定された各コレクションで要素が発生する最小回数です。

4.8. コレクションの減算

CollectionUtils.subtract は、2つのコレクションを入力として受け取り、最初のコレクションにはあるが2番目のコレクションにはない要素を含むコレクションを返します。

@Test
public void givenTwoLists_whenSubtracted_thenCheckElementNotPresentInA() {
    Collection<Customer> result = CollectionUtils.subtract(list1, list3);
    assertFalse(result.contains(customer1));
}

結果でコレクションが発生する回数は、最初のコレクションで発生する回数から2番目のコレクションで発生する回数を引いたものです。

4.9. コレクションの連合

CollectionUtils.union は、2つのコレクションの結合を行い、最初または2番目のコレクションのいずれかにあるすべての要素を含むコレクションを返します。

@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でから入手できます。