Apache Commons Collections SetUtils

Apache Commons Collections SetUtils

1. 概要

この記事では、Apache Commons CollectionsライブラリのSetUtilsAPIについて説明します。 簡単に言うと、これらのユーティリティを使用して、JavaのSetデータ構造に対して特定の操作を実行できます。

2. 依存関係のインストール

プロジェクトでSetUtilsライブラリを使用するには、プロジェクトのpom.xmlファイルに次の依存関係を追加する必要があります。


    org.apache.commons
    commons-collections4
    4.1

または、プロジェクトがGradleベースの場合は、プロジェクトのbuild.gradleファイルに依存関係を追加する必要があります。 また、build.gradleファイルのリポジトリセクションにmavenCentral()を追加する必要があります。

compile 'org.apache.commons:commons-collections4:4.1'

3. 述語セット

SetUtilsライブラリのpredicatedSet()メソッドを使用すると、セットに挿入されるすべての要素が満たす必要のある条件を定義できます。 ソースSetオブジェクトと述語を受け入れます。

これを使用して、Setのすべての要素が特定の条件を満たすことを簡単に検証できます。これは、サードパーティのライブラリ/ APIを開発するときに便利です。

いずれかの要素の検証が失敗した場合、IllegalArgumentExceptionがスローされます。 prevents the addition ofstrings that do not start with ‘L'の下のスニペットをsourceSetまたは返されたvalidatingSetに挿入します。

Set validatingSet
  = SetUtils.predicatedSet(sourceSet, s -> s.startsWith("L"));

ライブラリには、SortedSetNavigableSetをそれぞれ操作するためのpredicatedSortedSet()predicatedNavigableSet()もあります。

4. セットの和集合、差、および共通部分

ライブラリには、Set要素の和集合、差、および共通部分を計算できるメソッドがあります。

difference()メソッドは2つのSetオブジェクトを受け取り、不変のSetUtils.SetViewオブジェクトを返します。 返されるSetUtils.SetViewには、セットaにはあるが、セットbにはない要素が含まれています。

Set a = new HashSet<>(Arrays.asList(1, 2, 5));
Set b = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView result = SetUtils.difference(a, b);

assertTrue(result.size() == 1 && result.contains(5));

trying to perform write operations, like add() or addAll(), on the returned SetUtils.SetView will throw an UnsupportedOperationException.に注意してください

返された結果を変更するには、返されたSetUtils.SetViewtoSet()メソッドを呼び出して、書き込み可能なSetオブジェクトを取得する必要があります。

Set mutableSet = result.toSet();

SetUtilsライブラリのunionメソッドは、そのように聞こえます。セットabのすべての要素を返します。 unionメソッドは、不変のSetUtil.SetViewオブジェクトも返します。

Set expected = new HashSet<>(Arrays.asList(1, 2, 5));
SetUtils.SetView union = SetUtils.union(a, b);

assertTrue(SetUtils.isEqualSet(expected, union));

assertステートメントで使用されるTake note of the isEqualSet() method。 これは、2つのセットが等しいかどうかを効果的にチェックするSetUtilsライブラリの便利な静的メソッドです。

セットの交差点、つまり セットaとセットbの両方に存在する要素については、SetUtils.intersection()メソッドを使用します。 このメソッドは、SetUtil.SetViewオブジェクトも返します。

Set expected = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView intersect = SetUtils.intersection(a, b);

assertTrue(SetUtils.isEqualSet(expected, intersect));

5. セット要素の変換

別のエキサイティングな方法であるSetUtils.transformedSet()を見てみましょう。 このメソッドは、SetオブジェクトとTransformerインターフェースを受け入れます。 ソースセットに支えられて、Transformerインターフェイスのtransform()メソッドを使用して、セットのすべての要素を変換します。

変換ロジックは、Transformerインターフェイスのtransform()メソッドで定義され、セットに追加されたすべての要素に適用されます。 以下のコードスニペットは、セットに追加されたすべての要素に2を掛けます:

Set a = SetUtils.transformedSet(new HashSet<>(), e -> e * 2  );
a.add(2);

assertEquals(a.toArray()[0], 4);

transformedSet()メソッドは非常に便利です。たとえば、文字列から整数へのセットの要素のキャストにも使用できます。 出力のタイプが入力のサブタイプであることを確認してください。

HashSet,の代わりにSortedSetまたはNavigableSetを使用しているとすると、それぞれtransformedSortedSet()またはtransformedNavigableSet()を使用できます。

新しいHashSetインスタンスがtransformedSet()メソッドに渡されることに注意してください。 空でない既存のSetがメソッドに渡される状況では、既存の要素は変換されません。

既存の要素(およびその後に追加された要素)を変換する場合は、org.apache.commons.collections4.set.TransformedSettransformedSet()メソッドを使用する必要があります。

Set source = new HashSet<>(Arrays.asList(1));
Set newSet = TransformedSet.transformedSet(source, e -> e * 2);

assertEquals(newSet.toArray()[0], 2);
assertEquals(source.toArray()[0], 2);

ソースセットの要素が変換され、結果が返されたnewSet.にコピーされることに注意してください

6. 選言の設定

SetUtilsライブラリは、セットの論理和を見つけるために使用できる静的メソッドを提供します。 セットaとセットbの論理和は、セットaとセットbに固有のすべての要素です。

SetUtilsライブラリのdisjunction()メソッドの使用方法を見てみましょう。

Set a = new HashSet<>(Arrays.asList(1, 2, 5));
Set b = new HashSet<>(Arrays.asList(1, 2, 3));
SetUtils.SetView result = SetUtils.disjunction(a, b);

assertTrue(
  result.toSet().contains(5) && result.toSet().contains(3));

7. SetUtilsライブラリの他のメソッド

SetUtilsライブラリには、セットデータの処理を簡単にする他のメソッドがあります。

  • synchronizedSet()またはsynchronizedSortedSet()を使用して、スレッドセーフなSetを取得できます。 ただし、ドキュメントに記載されているように、非決定論的な動作を回避するために、返されたセットのイテレータをmust manually synchronizeします。

  • SetUtils.unmodifiableSet()を使用して、読み取り専用セットを取得できます。 返されたSetオブジェクトに要素を追加しようとすると、UnsupportedOperationExceptionがスローされることに注意してください。

  • タイプセーフで不変の空のセットを返すSetUtils.emptySet()メソッドもあります

  • SetUtils.emptyIfNull()メソッドは、null許容のSetオブジェクトを受け入れます。 指定されたSetがnullの場合、空の読み取り専用のSetを返します。それ以外の場合は、指定されたSetを返します

  • SetUtils.orderedSet()は、要素が追加される順序を維持するSetオブジェクトを返します

  • SetUtils.hashCodeForSet()は、セットのハッシュコードを生成できます–同じ要素の2つのセットが同じハッシュコードを持つように

  • SetUtils.newIdentityHashSet()は、equals()メソッドの代わりに==を使用して要素に一致するHashSetを返します。 警告についてお読みくださいhere

8. 結論

この記事では、SetUtilsライブラリの要点を探りました。 ユーティリティクラスは、設定されたデータ構造の操作を簡単かつ刺激的なものにする静的メソッドを提供します。 また、生産性も向上します。

いつものように、コードスニペットはover on GitHubで利用できます。 SetUtils APIの公式ドキュメントはfound hereにすることができます。