Apache Commons Collections CollectionUtilsへのガイド

Apache Commons Collections CollectionUtilsのガイド

1. 概要

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

2. Mavenの依存関係

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


    org.apache.commons
    commons-collections4
    4.1

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

3. セットアップ

CustomerAddress classes:を追加しましょう

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およびListインスタンスを手元に置いておきます。

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 list1 = Arrays.asList(customer1, customer2, customer3);
List list2 = Arrays.asList(customer4, customer5, customer6);
List list3 = Arrays.asList(customer1, customer2);

List linkedList1 = new LinkedList<>(list1);

4. CollectionUtils

Apache Commons CollectionUtilsクラスで最もよく使用されるメソッドのいくつかを見ていきましょう。

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

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

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

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

    assertFalse(list1.contains(null));
}

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

4.2. 照合リスト

We can use collate method to collate two already sorted lists.このメソッドは、マージする両方のリストを引数として受け取り、単一のソートされたリストを返します。

@Test
public void givenTwoSortedLists_whenCollated_thenSorted() {
    List 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のオブジェクトのリストとtransformerを引数として取ります。

この操作の結果は、クラスBのオブジェクトのリストです。

@Test
public void givenListOfCustomers_whenTransformed_thenListOfAddress() {
    Collection
addressCol = CollectionUtils.collect(list1, new Transformer() { public Address transform(Customer customer) { return customer.getAddress(); } }); List
addressList = new ArrayList<>(addressCol); assertTrue(addressList.size() == 3); assertTrue(addressList.get(0).getLocality().equals("locality1")); }

4.4. オブジェクトのフィルタリング

Using filter we can remove objects which do not satisfy a given condition from a list.このメソッドは、リストを最初の引数として取り、Predicateを2番目の引数として取ります。

The filterInverse method does the opposite.Predicateがtrueを返すと、リストからオブジェクトを削除します。

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

@Test
public void givenCustomerList_WhenFiltered_thenCorrectSize() {

    boolean isModified = CollectionUtils.filter(linkedList1,
      new Predicate() {
        public boolean evaluate(Customer customer) {
            return Arrays.asList("Daniel","Kyle").contains(customer.getName());
        }
    });

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

ブールフラグではなく結果のリストを返す場合は、selectselectRejectedを使用できます。

4.5. 空でないことを確認する

The isNotEmpty method is quite handy when we want to check if there is at least single element in a list.同じことを確認するもう1つの方法は次のとおりです。

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

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

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

The isEmpty does the opposite.指定されたリストがnullであるか、リストに要素がゼロであるかを確認します。

List emptyList = new ArrayList<>();
List 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. コレクションの交差点

We can use CollectionUtils.intersection method to get the intersection of two collections.このメソッドは、2つのコレクションを受け取り、両方の入力コレクションで共通の要素のコレクションを返します。

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

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

4.8. コレクションの減算

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

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

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

4.9. コレクションの連合

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

@Test
public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() {
    Collection union = CollectionUtils.union(list1, list2);

    assertTrue(union.contains(customer1));
    assertTrue(union.contains(customer4));
}

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

5. 結論

これで完了です。

CollectionUtilsの一般的に使用されるメソッドのいくつかを実行しました。これは、Javaプロジェクトでコレクションを操作するときに定型文を回避するのに非常に役立ちます。

いつものように、コードは利用可能ですover on GitHub.