Javatuplesの紹介

Javatuplesの概要

1. 概要

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

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

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

2. 組み込みのJavatuplesクラス

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

上記のクラスに加えて、KeyValue<A,B>LabelValue<A,B>の2つの追加クラスがあり、Pair<A,B>と同様の機能を提供しますが、セマンティクスが異なります。

official siteに従って、all the classes injavatuples are typesafe and immutable。 各タプルクラスは、IterableSerializable、およびComparableインターフェイスを実装します。

3. Maven依存関係の追加

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


    org.javatuples
    javatuples
    1.2

latest versionについては、CentralMavenリポジトリを確認してください。

4. タプルの作成

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

Pair pair = new Pair("A pair", 55);

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

Triplet triplet = Triplet.with("hello", 23, 1.2);

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

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

the number of items in the collection should match the type of the tuple that we want to createに注意してください。 たとえば、上記のコレクションを使用してQuintetを作成することはできません。これは、正確に5つの要素を必要とするためです。 同じことが、Quintetよりも高次のタプルクラスにも当てはまります。

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

Pair pairFromList = Pair.fromIterable(listOfNames, 2);

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

タプルは任意の配列からも簡単に作成できます。

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

5. Getting Values from Tuples

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

新しいカルテットを作成して、いくつかの値を取得しましょう。

Quartet 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)メソッドです。 取得する要素のゼロから始まる位置を取ります。 This method is not type-safe and requires explicit casting

Quartet 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);

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

6. タプルへの値の設定

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

Pair john = Pair.with("john", 32);
Pair alex = john.setAt0("alex");

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

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

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

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

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

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

上記の例から、1つの要素をPairに追加すると、新しいTripletが作成されることは明らかです。 同様に、1つの要素をTripletに追加すると、新しいQuartetが作成されます。

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

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

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

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

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

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

Pair pair1 = Pair.with("john", 32);
Triplet 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()メソッド呼び出し後のPair<String, Integer>Triplet<String, String, Integer>のタイプの順序の違いに注意してください。

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

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

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

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

Pair pair1 = Pair.with("john", 32);
Unit unit = pair1.removeFrom0();

assertThat(unit.contains(32));

8. タプルをList/Arrayに変換する

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

Quartet quartet
  = Quartet.with("john", 72.5, 32, "1051 SW");
List list = quartet.toList();

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


かなり簡単です。 ここで注意すべき唯一のことは、タプルに同じタイプの要素が含まれている場合でも、常にList<Object>,を取得することです。

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

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

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

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

9. 結論

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

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