Javatuplesの紹介
1概要
タプルとは、互いに関連している場合とそうでない場合があるいくつかの要素の集合です。つまり、タプルは匿名オブジェクトと見なすことができます。
たとえば、[“RAM”、16、 “Astra”]は3つの要素を含むタプルです。
この記事では、タプルベースのデータ構造(http://www.javatuples.org/index.html[
javatuples
])を使って作業することを可能にする非常に単純なライブラリについて簡単に説明します。
2組み込み
Javatuples
クラス
このライブラリは、タプルに関する私たちの要求の大部分を満足させる10の異なるクラスを提供します。
-
Unit <A>
-
ペア<A、B>
-
トリプレット<A、B、C>
-
Quartet <A、B、C、D>
-
クインテット<A、B、C、D、E>
-
エクステット<A、B、C、D、E、F>
-
セプテット<A、B、C、D、E、F、G>
-
オクテット<A、B、C、D、E、F、G、H>
-
有効<A、B、C、D、E、F、G、H、I>
-
ディケード<A、B、C、D、E、F、G、H、I、J>
上記のクラスに加えて、
KeyValue <A、B>
と
LabelValue <A、B>
の2つの追加クラスがあり、これらは
Pair <A、B>
と同様の機能を提供しますが、意味は異なります。
公式サイト
に従って、
javatuplesの
すべてのクラスは型保証があり不変です
。各タプルクラスは、
Iterable
、
Serializable
、および
Comparable
インタフェースを実装します。
3 Mavenの依存関係を追加する
Mavenの依存関係を
pom.xml
に追加しましょう。
<dependency>
<groupId>org.javatuples</groupId>
<artifactId>javatuples</artifactId>
<version>1.2</version>
</dependency>
最新バージョン
についてはCentral Mavenリポジトリを確認してください。
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()
メソッドで開始インデックスを指定することで、上記のコレクションを使用して
Pair
や
Triplet
などの低次のタプルを作成できます。
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を作成していくつかの値を取得しましょう。
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
」の位置は0、「
72.5
」の位置は1などです。
getValueX()
メソッドはタイプセーフです。つまり、キャスティングは不要です。
これに代わるものは
getValue(int pos)
メソッドです。取得する要素の位置は0から始まります。
このメソッドは型保証がなく、明示的なキャストが必要です
:
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()
と同様に、javatuple内のすべてのクラスには
setAtX()
メソッドがあります。繰り返しになりますが、
X
は設定したい要素の0から始まる位置です。
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"));
上記の例から、
Pair
に要素を1つ追加すると、新しい
Triplet
が作成されることがわかります。同様に、
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
は、要素を追加する位置の0から始まる位置です。
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()
メソッド呼び出しの後の
Pair <String、Integer>
と
Triplet <String、String、Integer>
の型の順序の違いに注意してください。
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
は削除される要素の0から始まる位置を指定します。
Pair<String, Integer> pair1 = Pair.with("john", 32);
Unit<Integer> unit = pair1.removeFrom0();
assertThat(unit.contains(32));
8タプルを
List/Array
に変換する
List
をタプルに変換する方法は既に見ました。それでは、タプルを
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);
それはかなり簡単です。ここで注意すべき唯一のことは、タプルが同じタイプの要素を含んでいても、常に
List <Object>、
を取得するということです。
最後に、タプルを配列に変換しましょう。
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ライブラリーを調べ、その単純さを観察しました。それは洗練された意味論を提供し、本当に使いやすいです。
over GitHub
のこの記事の完全なソースコードを必ずチェックしてください。完全なソースコードには、ここで説明したものよりも少し多くの例が含まれています。この記事を読んだ後は、追加の例を理解するのに十分なほど簡単になるはずです。