Apache Commons Collections SetUtils

1概要

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

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

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

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

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

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

3述語セット

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

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

検証がいずれかの要素に対して失敗した場合、 IllegalArgumentException がスローされます。以下のスニペットは、 Lで始まらない ** 文字列が sourceSet または返された validatingSet に追加されるのを防ぎます。

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

このライブラリには、 SortedSet NavigableSet を操作するための predicatedSortedSet() predicatedNavigableSet() もあります。

4集合の和、差、および交点

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

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

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

assertTrue(result.size() == 1 && result.contains(5));
  • 返された SetUtils.SetView に対して add() addAll() などの書き込み操作を実行しようとすると、 UnsupportedOperationException がスローされます。

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

Set<Integer> mutableSet = result.toSet();

SetUtils ライブラリの union メソッドは正確には実行されますが、set a b のすべての要素が返されます。 union メソッドは、不変の SetUtil.SetView オブジェクトも返します。

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

assertTrue(SetUtils.isEqualSet(expected, union));
  • assert文で使用されている isEqualSet() メソッドに注意してください。

これは SetUtils ライブラリの便利な静的メソッドで、2つのセットが等しいかどうかを効果的にチェックします。

集合、つまりset a とset b の両方に存在する要素の共通部分を取得するには、 SetUtils.intersection() メソッドを使用します。

このメソッドは SetUtil.SetView オブジェクトも返します。

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

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

5集合要素の変換

別のおもしろいメソッド、 SetUtils.transformedSet() を見てみましょう。このメソッドは Set オブジェクトと Transformer インターフェースを受け取ります。ソースセットに支えられて、それはセットのすべての要素を変換するために Transformer インターフェースの transform() メソッドを使います。

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

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

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

transformedSet() メソッドはかなり便利です - それらは集合の要素をキャストするのにさえ使うことができます - 例えばStringからIntegerへ。出力の型が入力のサブタイプであることを確認してください。

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

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

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

Set<Integer> source = new HashSet<>(Arrays.asList(1));
Set<Integer> 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<Integer> a = new HashSet<>(Arrays.asList(1, 2, 5));
Set<Integer> b = new HashSet<>(Arrays.asList(1, 2, 3));
SetUtils.SetView<Integer> result = SetUtils.disjunction(a, b);

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

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

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

  • synchronizedSet() または synchronizedSortedSet() を使用して

スレッドセーフ Set ただし、ドキュメントに記載されているように、 手動で 決定論的でないことを避けるために、返されたセットのイテレータを同期させる 動作 ** 読み取り専用のセットを取得するために SetUtils.unmodifiableSet() を使用できます。

返された Set Objectに要素を追加しようとすると、 UnsupportedOperationException をスローします。 ** を返す SetUtils.emptySet() メソッドもあります。

型保証、不変の空集合 ** SetUtils.emptyIfNull() メソッドは、NULL可能な Set オブジェクトを受け入れます。

指定された Set がnullの場合、空の読み取り専用のS __et を返します。 それ以外の場合は、指定された Set を返します。 ** SetUtils.orderedSet() は、を保持する Set__オブジェクトを返します。

要素が追加された順序 ** SetUtils.hashCodeForSet() はセットのハッシュコードを生成できます

同じ要素の2つのセットが同じになるように ハッシュコード ** SetUtils.newIdentityHashSet() は、 == を使用する HashSet を返します。

equals() メソッドの代わりに要素を照合します。その注意事項についてお読みくださいhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/SetUtils.html#newIdentityHashSet--[こちら]

8.まとめ

この記事では、私たちは SetUtils ライブラリーの重要性を探りました。このユーティリティクラスは、セットデータ構造を扱うのを簡単でエキサイティングにする静的メソッドを提供します。生産性も向上します。

いつものように、コードスニペットはhttps://github.com/eugenp/tutorials/tree/master/libraries-apache-commons[over on GitHub]から入手できます。 SetUtils APIの公式ドキュメントは、https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/SetUtils.html[こちら]にあります。

"

  • «** 前へ