Javatuplesの紹介

1。概要

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

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

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

2.組み込みのJavatuplesクラス

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

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

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

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

3.Mavenの依存関係を追加する

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

 org.javatuples javatuples 1.2 

最新バージョンについては、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);

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

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

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

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

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

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

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

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」の位置は0、「72.5」の位置は1などです。

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

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

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

The important thing here is that the return type of setAtX() method is the tuple type itself. This is because the javatuples are immutable. Setting any new value will leave the original instance intact.

7. Adding and Removing Elements from Tuples

We can conveniently add new elements to the tuples. However, this will result in a new tuple of one order higher being created:

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

It is clear from the above example that adding one element to a Pair will create a new Triplet. Similarly, adding one element to a Triplet will create a new Quartet.

The example above also demonstrates the use of contains() method provided by all the classes in javatuples. This is a really handy method for verifying if the tuple contains a given value.

It is also possible to add one tuple to another using the add() method:

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

Note the use of containsAll() method. It will return true if all the elements of pair1 are present in quartet2.

By default, the add() method adds the element as a last element of the tuple. However, it is possible to add the element at a given position using addAtX() method, where X is the zero-based position where we want to add the element:

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

This example adds the String at position 1, which is then verified by the indexOf() method. Please note the difference in order of the types for the Pair and the Triplet after the call to addAt1() method call.

We can also add multiple elements using any of add() or addAtX() methods:

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

In order to remove an element from the tuple, we can use the removeFromX() method. Again, X specifies the zero-based position of the element to be removed:

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

8. Converting Tuples to List/Array

We have already seen how to convert a List to a tuple. Let's now see hot to convert a tuple to a List:

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

It is fairly simple. The only thing to note here is that we will always get a List, even if the tuple contains the same type of elements.

Finally, let's convert the tuple to an array:

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

Clear enough, the toArray() method always returns an Object[].

9. Conclusion

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

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