Einführung in Javatuples

Einführung in Javatuples

1. Überblick

Ein Tupel ist eine Sammlung mehrerer Elemente, die miteinander in Beziehung stehen oder nicht. Mit anderen Worten, Tupel können als anonyme Objekte betrachtet werden.

Beispielsweise ist ["RAM", 16, "Astra"] ein Tupel, das drei Elemente enthält.

In diesem Artikel werfen wir einen kurzen Blick auf eine wirklich einfache Bibliothek, mit der wir mit den tupelbasierten Datenstrukturen mit dem Namenjavatuples arbeiten können.

2. EingebauteJavatuples Klassen

Diese Bibliothek bietet uns zehn verschiedene Klassen, die für die meisten unserer Anforderungen in Bezug auf Tupel ausreichen:

Zusätzlich zu den obigen Klassen gibt es zwei zusätzliche Klassen,KeyValue<A,B> undLabelValue<A,B>, die ähnliche Funktionen wiePair<A,B> bieten, sich jedoch in der Semantik unterscheiden.

Gemäßofficial site,all the classes injavatuples are typesafe and immutable. Jede der Tupelklassen implementiert die SchnittstelleIterable,Serializable undComparable.

3. Hinzufügen einer Maven-Abhängigkeit

Fügen wir die Maven-Abhängigkeit zu unserenpom.xml hinzu:


    org.javatuples
    javatuples
    1.2

Bitte überprüfen Sie das Central Maven-Repository auflatest version.

4. Tupel erstellen

Das Erstellen eines Tupels ist sehr einfach. Wir können die entsprechenden Konstruktoren verwenden:

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

Es gibt auch eine etwas weniger ausführliche und semantisch elegante Möglichkeit, ein Tupel zu erstellen:

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

Wir können auch Tupel ausIterable erstellen:

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

Bitte beachten Sie, dassthe number of items in the collection should match the type of the tuple that we want to create. Zum Beispiel können wir mit der obigen Auflistung keinQuintet erstellen, da genau fünf Elemente erforderlich sind. Gleiches gilt für jede andere Tupelklasse mit einer höheren Ordnung alsQuintet.

Mit der obigen Auflistung können wir jedoch ein Tupel niedrigerer Ordnung wiePair oderTriplet erstellen, indem wir einen Startindex in der MethodefromIterable() angeben:

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

Der obige Code führt dazu, dassPair erstellt werden, die "anne" und "alex" enthalten.

Tupel können auch bequem aus einem beliebigen Array erstellt werden:

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

5. Getting Values from Tuples

Jede Klasse injavatuples hat einegetValueX()-Methode zum Abrufen der Werte von Tupeln, wobeiX die Reihenfolge des Elements innerhalb des Tupels angibt. Wie die Indizes in Arrays beginnt der Wert vonX bei Null.

Erstellen wir ein neues Quartett und holen uns einige Werte:

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

Wie wir sehen können, ist die Position von "john" Null, "72.5" ist eins und so weiter.

Beachten Sie, dass die Methoden vongetValueX()typsicher sind. Das heißt, es ist kein Casting erforderlich.

Eine Alternative dazu ist diegetValue(int pos)-Methode. Es nimmt eine auf Null basierende Position des abzurufenden Elements ein. 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);

Bitte beachten Sie, dass die KlassenKeyValue undLabelValueihre entsprechenden MethodengetKey()/getValue() undgetLabel()/getValue() haben.

6. Werte auf Tupel setzen

Ähnlich wie beigetValueX() haben alle Klassen in JavatuplessetAtX() Methoden. Wiederum istX eine auf Null basierende Position für das Element, das wir setzen möchten:

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

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

Wichtig hierbei ist, dass der Rückgabetyp dersetAtX()-Methode der Tupeltyp selbst ist. Dies liegt daran, dassthe javatuples are immutable. Wenn Sie einen neuen Wert festlegen, bleibt die ursprüngliche Instanz erhalten.

7. Hinzufügen und Entfernen von Elementen zu Tupeln

Wir können den Tupeln bequem neue Elemente hinzufügen. Dies führt jedoch dazu, dass ein neues Tupel einer höheren Ordnung erstellt wird:

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

Aus dem obigen Beispiel geht hervor, dass durch Hinzufügen eines Elements zuPair ein neuesTriplet erstellt wird. In ähnlicher Weise wird durch Hinzufügen eines Elements zuTriplet ein neuesQuartet erstellt.

Das obige Beispiel zeigt auch die Verwendung der Methodecontains(), die von allen Klassen injavatuples bereitgestellt wird. Dies ist eine sehr praktische Methode, um zu überprüfen, ob das Tupel einen bestimmten Wert enthält.

Es ist auch möglich, ein Tupel mit der Methodeadd()zu einem anderen hinzuzufügen:

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

Beachten Sie die Verwendung der MethodecontainsAll(). Es wirdtrue zurückgegeben, wenn alle Elemente vonpair1 inquartet2 vorhanden sind.

Standardmäßig fügt die Methodeadd() das Element als letztes Element des Tupels hinzu. Es ist jedoch möglich, das Element an einer bestimmten Position mit der MethodeaddAtX() hinzuzufügen, wobeiX die auf Null basierende Position ist, an der das Element hinzugefügt werden soll:

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

In diesem Beispiel werden dieString an Position 1 hinzugefügt, die dann mit der MethodeindexOf() überprüft werden. Bitte beachten Sie den Unterschied in der Reihenfolge der Typen fürPair<String, Integer> undTriplet<String, String, Integer> nach dem Aufruf des MethodenaufrufsaddAt1().

Wir können auch mehrere Elemente mit einer der Methodenadd() oderaddAtX()hinzufügen:

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

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

Um ein Element aus dem Tupel zu entfernen, können wir die MethoderemoveFromX()verwenden. Wiederum gibtX die auf Null basierende Position des zu entfernenden Elements an:

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

assertThat(unit.contains(32));

8. Tupel inList/Array konvertieren

Wir haben bereits gesehen, wie man einList in ein Tupel umwandelt. Lassen Sie uns nun sehen, wie heiß es ist, ein Tupel inList umzuwandeln:

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

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


Es ist ziemlich einfach. Das einzige, was hier zu beachten ist, ist, dass wir immer einList<Object>, erhalten, selbst wenn das Tupel den gleichen Elementtyp enthält.

Zuletzt konvertieren wir das Tupel in ein Array:

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

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

Klar genug, die MethodetoArray() gibt immerObject[] zurück.

9. Fazit

In diesem Artikel haben wir die Javatuples-Bibliothek untersucht und festgestellt, dass sie einfach ist. Es bietet elegante Semantik und ist wirklich einfach zu bedienen.

Stellen Sie sicher, dass Sie den vollständigen Quellcode für diesen Artikelover on GitHub lesen. Der vollständige Quellcode enthält ein bisschen mehr Beispiele als die hier behandelten. Nach dem Lesen dieses Artikels sollten die zusätzlichen Beispiele leicht verständlich sein.