Введение в Javatuples

1. Обзор

Кортеж - это набор из нескольких элементов, которые могут быть связаны друг с другом, а могут и не быть. Другими словами, кортежи можно рассматривать как анонимные объекты.

Например, [«RAM», 16, «Astra»] - это кортеж, содержащий три элемента.

В этой статье мы кратко рассмотрим действительно простую библиотеку, которая позволяет нам работать со структурами данных на основе кортежей, названная javatuples .

2. Встроенные классы Javatuples

Эта библиотека предоставляет нам десять различных классов, которые удовлетворяют большинству наших требований, связанных с кортежами:

  • Единица измерения
  • Пара
  • Триплет
  • Квартет
  • Квинтет
  • Секстет
  • Септет
  • Октет
  • Эннеад
  • Десятилетие

В дополнение к указанным выше классов, есть два дополнительных класса, KeyValue и LabelValue , которые обеспечивают функциональные возможности, аналогичные Pair , но различаются по семантике.

Согласно официальному сайту, все классы в javatuples являются типизированными и неизменяемыми . Каждый из классов кортежей реализует интерфейс Iterable , Serializable и Comparable .

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

Давайте добавим зависимость Maven к нашему pom.xml :

 org.javatuples javatuples 1.2 

Проверьте последнюю версию в центральном репозитории 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 ».

Кортежи также удобно создавать из любого массива:

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 » равна нулю, « 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 () / ПолучитьЗначение () и getLabel () / ПолучитьЗначение () .

6. Установка значений для кортежей

Подобно getValueX () , все классы в javatuples имеют методы setAtX () . Опять же, X - это позиции с нулевым отсчетом для элемента, который мы хотим установить:

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

Здесь важно то, что возвращаемый тип метода setAtX () - это сам кортеж. Это потому, что javatuples неизменяемы . Установка любого нового значения оставит исходный экземпляр нетронутым.

7. Добавление и удаление элементов из кортежей

Мы можем удобно добавлять новые элементы в кортежи. Однако это приведет к созданию нового кортежа на порядок выше:

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