Въведение в Javatuples

1. Общ преглед

Кортежът е колекция от няколко елемента, които могат или не могат да бъдат свързани помежду си. С други думи, кортежите могат да се считат за анонимни обекти.

Например, [„RAM“, 16, „Astra“] е кортеж, съдържащ три елемента.

В тази статия ще разгледаме набързо една наистина проста библиотека, която ни позволява да работим със структурирани от кортежи структури от данни, наречени javatuples .

2. Вградени класове Javatuples

Тази библиотека ни предоставя десет различни класа, които биха били достатъчни за повечето ни изисквания, свързани с кортежи:

  • Мерна единица
  • Сдвояване
  • Триплет
  • Квартет
  • Квинтет
  • Секстет
  • Септет
  • Октет
  • Ennead
  • Десетилетие

В допълнение към класовете по-горе, има два допълнителни класа, KeyValue и LabelValue , които предоставят функционалности, подобни на Pair , но се различават по семантика.

Според официалния сайт всички класове в javatuples са безопасни и неизменни . Всеки клас от кортежи реализира интерфейса Iterable , Serializable и Comparable .

3. Добавяне на зависимост на Maven

Нека добавим зависимостта Maven към нашия pom.xml :

 org.javatuples javatuples 1.2 

Моля, проверете хранилището Central Maven за най-новата версия.

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

Моля, обърнете внимание, че броят на елементите в колекцията трябва да съвпада с вида на кортежа, който искаме да създадем . Например, не можем да създадем квинтет, използвайки горната колекция, тъй като той изисква точно пет елемента. Същото важи и за всеки друг клас кортежи, който има по-висок ред от Quintet .

Можем обаче да създадем кортеж от по-нисък ред като Pair или Triplet, като използваме горната колекция, като посочим начален индекс в метода fromIterable () :

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

Горният код ще доведе до създаване на двойка, съдържаща „ anne “ и „ alex “.

Tuples могат да бъдат удобно създадени и от всеки масив:

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

5. Получаване на стойности от 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);

Както виждаме, позицията на „ Джон “ е нула, „ 72,5 “ е една и т.н.

Имайте предвид, че методите 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);

Моля, обърнете внимание, че класовете KeyValue и LabelValue имат съответните методи getKey () / getValue () и getLabel () / getValue () .

6. Задаване на стойности на Tuples

Подобно на getValueX () , всички класове в javatuples имат методи setAtX () . Отново X е нулева позиция на елемента, който искаме да зададем:

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

Важното тук е, че върнатият тип setAtX () метод е самият тип кортеж. Това е така, защото javatuples са неизменни . Задаването на всяка нова стойност ще остави оригиналния екземпляр непокътнат.

7. Добавяне и премахване на елементи от Tuples

Можем удобно да добавяме нови елементи към кортежите. Това обаче ще доведе до създаването на нов набор от един ред по-висок:

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

От горния пример става ясно, че добавянето на един елемент към двойка ще създаде нов триплет . По същия начин добавянето на един елемент към триплет ще създаде нов квартет .

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. Пълният изходен код съдържа малко повече примери от тези, разгледани тук. След като прочетете тази статия, допълнителните примери трябва да бъдат достатъчно лесни за разбиране.