1. 概要

タプルは、相互に関連している場合と関連していない場合があるいくつかの要素のコレクションです。 つまり、タプルは匿名オブジェクトと見なすことができます。

たとえば、[“ RAM”、16、“ Astra”]は、3つの要素を含むタプルです。

この記事では、javatuplesという名前のタプルベースのデータ構造を操作できる非常に単純なライブラリについて簡単に説明します。

2. 組み込みのJavatuplesクラス

このライブラリは、タプルに関連する要件のほとんどを満たす10の異なるクラスを提供します。

  • 単位
  • ペア
  • トリプレット
  • カルテット
  • クインテット
  • セクステット
  • セプテット
  • オクテット
  • エジプト九柱の神々
  • 十年

上記のクラスに加えて、2つの追加クラスがあります。 KeyValue LabelValue 、と同様の機能を提供しますペア 、ただしセマンティクスが異なります。

公式サイトによると、 javatuplesのすべてのクラスはタイプセーフで不変です。 各タプルクラスは、 Iterable Serializable 、およびCompareableインターフェイスを実装します。

3. Maven依存関係の追加

Mavenの依存関係をpom.xmlに追加しましょう。

<dependency>
    <groupId>org.javatuples</groupId>
    <artifactId>javatuples</artifactId>
    <version>1.2</version>
</dependency>

最新バージョンについては、CentralMavenリポジトリーを確認してください。

4. タプルの作成

タプルの作成は本当に簡単です。 対応するコンストラクターを使用できます。

Pair<String, Integer> pair = new Pair<String, Integer>("A pair", 55);

タプルを作成するための、少し冗長で意味的にエレガントな方法もあります。

Triplet<String, Integer, Double> triplet = Triplet.with("hello", 23, 1.2);

Iterableからタプルを作成することもできます。

List<String> listOfNames = Arrays.asList("john", "doe", "anne", "alex");
Quartet<String, String, String, String> quartet
  = Quartet.fromCollection(collectionOfNames);

コレクション内のアイテムの数は、作成するタプルのタイプと一致する必要があることに注意してください。 たとえば、上記のコレクションを使用して Quintet を作成することはできません。これは、正確に5つの要素を必要とするためです。 Quintetよりも高次のタプルクラスについても同じことが言えます。

ただし、 fromIterable()メソッドで開始インデックスを指定することにより、上記のコレクションを使用してPairTripletのような低次のタプルを作成できます。

Pair<String, String> pairFromList = Pair.fromIterable(listOfNames, 2);

上記のコードにより、「anne」と「alex」を含むPairが作成されます。

タプルは、任意のアレイからも便利に作成できます。

String[] names = new String[] {"john", "doe", "anne"};
Triplet<String, String, String> triplet2 = Triplet.fromArray(names);

5. タプルから値を取得する

javatuples のすべてのクラスには、タプルから値を取得するための getValueX()メソッドがあります。ここで、Xはタプル内の要素の順序を指定します。 配列のインデックスと同様に、Xの値はゼロから始まります。

新しいカルテットを作成し、いくつかの値をフェッチしてみましょう。

Quartet<String, Double, Integer, String> quartet 
  = Quartet.with("john", 72.5, 32, "1051 SW");

String name = quartet.getValue0();
Integer age = quartet.getValue2();
 
assertThat(name).isEqualTo("john");
assertThat(age).isEqualTo(32);

ご覧のとおり、「 john 」の位置はゼロ、「72.5」の位置は1などです。

getValueX()メソッドはタイプセーフであることに注意してください。 つまり、キャストは必要ありません。

これに代わる方法は、 getValue(int pos)メソッドです。 フェッチされる要素のゼロベースの位置を取ります。 このメソッドはタイプセーフではなく、明示的なキャストが必要です

Quartet<String, Double, Integer, String> quartet 
  = Quartet.with("john", 72.5, 32, "1051 SW");

String name = (String) quartet.getValue(0);
Integer age = (Integer) quartet.getValue(2);
 
assertThat(name).isEqualTo("john");
assertThat(age).isEqualTo(32);

クラスKeyValueおよびLabelValueには、対応するメソッド getKey()/ getValue()および getLabel()/ getValue()があることに注意してください。 ]。

6. タプルへの値の設定

getValueX()と同様に、javatuplesのすべてのクラスには setAtX()メソッドがあります。 ここでも、 X は、設定する要素のゼロベースの位置です。

Pair<String, Integer> john = Pair.with("john", 32);
Pair<String, Integer> alex = john.setAt0("alex");

assertThat(john.toString()).isNotEqualTo(alex.toString());

ここで重要なのは、 setAtX()メソッドの戻り型がタプル型そのものであるということです。 これは、javatuplesが不変であるためです。 新しい値を設定すると、元のインスタンスはそのまま残ります。

7. タプルへの要素の追加と削除

タプルに新しい要素を簡単に追加できます。 ただし、これにより、1桁上の新しいタプルが作成されます。

Pair<String, Integer> pair1 = Pair.with("john", 32);
Triplet<String, Integer, String> triplet1 = pair1.add("1051 SW");

assertThat(triplet1.contains("john"));
assertThat(triplet1.contains(32));
assertThat(triplet1.contains("1051 SW"));

上記の例から、ペアに1つの要素を追加すると、新しいトリプレットが作成されることが明らかです。 同様に、 Triplet に1つの要素を追加すると、新しいQuartetが作成されます。

上記の例は、 javatuplesのすべてのクラスによって提供されるcontains()メソッドの使用法も示しています。 これは、タプルに特定の値が含まれているかどうかを確認するための非常に便利な方法です。

add()メソッドを使用して、あるタプルを別のタプルに追加することもできます。

Pair<String, Integer> pair1 = Pair.with("john", 32);
Pair<String, Integer> pair2 = Pair.with("alex", 45);
Quartet<String, Integer, String, Integer> quartet2 = pair1.add(pair2);

assertThat(quartet2.containsAll(pair1));
assertThat(quartet2.containsAll(pair2));

containsAll()メソッドの使用に注意してください。 pair1のすべての要素がquartet2に存在する場合、trueを返します。

デフォルトでは、 add()メソッドは、タプルの最後の要素として要素を追加します。 ただし、 addAtX()メソッドを使用して、特定の位置に要素を追加することは可能です。ここで、 X は、要素を追加するゼロベースの位置です。

Pair<String, Integer> pair1 = Pair.with("john", 32);
Triplet<String, String, Integer> triplet2 = pair1.addAt1("1051 SW");

assertThat(triplet2.indexOf("john")).isEqualTo(0);
assertThat(triplet2.indexOf("1051 SW")).isEqualTo(1);
assertThat(triplet2.indexOf(32)).isEqualTo(2);

この例では、位置1に String を追加します。これは、 indexOf()メソッドによって検証されます。 タイプの順序の違いに注意してくださいペアそしてそのトリプレットに電話した後 addAt1() メソッド呼び出し。

add()または addAtX()メソッドのいずれかを使用して複数の要素を追加することもできます。

Pair<String, Integer> pair1 = Pair.with("john", 32);
Quartet<String, Integer, String, Integer> quartet1 = pair1.add("alex", 45);

assertThat(quartet1.containsAll("alex", "john", 32, 45));

タプルから要素を削除するには、 removeFromX()メソッドを使用できます。 ここでも、 X は、削除する要素のゼロベースの位置を指定します。

Pair<String, Integer> pair1 = Pair.with("john", 32);
Unit<Integer> unit = pair1.removeFrom0();

assertThat(unit.contains(32));

8. タプルをリスト/配列に変換する

Listをタプルに変換する方法はすでに見てきました。 タプルをリストに変換するためのホットを見てみましょう。

Quartet<String, Double, Integer, String> quartet
  = Quartet.with("john", 72.5, 32, "1051 SW");
List<Object> list = quartet.toList();

assertThat(list.size()).isEqualTo(4);

かなり簡単です。 ここで注意する唯一のことは、私たちは常にリスト、 タプルに同じタイプの要素が含まれている場合でも。

最後に、タプルを配列に変換しましょう。

Quartet<String, Double, Integer, String> quartet
  = Quartet.with("john", 72.5, 32, "1051 SW");
Object[] array = quartet.toArray();

assertThat(array.length).isEqualTo(4);

十分に明確なことですが、 toArray()メソッドは常に Object[]を返します。

9. 結論

この記事では、javatuplesライブラリを調べて、その単純さを観察しました。 エレガントなセマンティクスを提供し、本当に使いやすいです。

この記事の完全なソースコードをGitHubで確認してください。 完全なソースコードには、ここで説明したものよりも少し多くの例が含まれています。 この記事を読んだ後、追加の例は理解しやすいはずです。