Введение в Javatuples

Введение в Javatuples

1. обзор

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

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

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

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

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

В дополнение к классам выше, есть два дополнительных класса,KeyValue<A,B> иLabelValue<A,B>, которые предоставляют функции, аналогичныеPair<A,B>, но отличаются семантикой.

Согласноofficial site,all the classes injavatuples are typesafe and immutable. Каждый из классов кортежей реализует интерфейсIterable,Serializable иComparable.

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

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


    org.javatuples
    javatuples
    1.2

Пожалуйста, проверьте центральный репозиторий Maven на наличиеlatest version.

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

Обратите внимание, чтоthe number of items in the collection should match the type of the tuple that we want to create. Например, мы не можем создатьQuintet, используя указанную выше коллекцию, поскольку для этого требуется ровно пять элементов. То же самое верно для любого другого класса кортежей, имеющего более высокий порядок, чемQuintet.

Однако мы можем создать кортеж более низкого порядка, напримерPair илиTriplet, используя вышеуказанную коллекцию, указав начальный индекс в методеfromIterable():

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

Приведенный выше код приведет к созданиюPair, содержащего «anne» и «alex».

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

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

5. Getting Values from 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);

Как мы видим, позиция «john» равна нулю, «72.5» равна единице и так далее.

Обратите внимание, что методыgetValueX() безопасны по типу. Это означает, что кастинг не требуется.

Альтернативой этому является методgetValue(int pos). Требуется нулевая позиция элемента для извлечения. 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);

Обратите внимание, что классыKeyValue иLabelValue имеют соответствующие методы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());

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

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

Из приведенного выше примера ясно, что добавление одного элемента кPair создаст новыйTriplet. Точно так же добавление одного элемента кTriplet создаст новыйQuartet.

В приведенном выше примере также демонстрируется использование методаcontains(), предоставляемого всеми классами вjavatuples. Это действительно удобный метод для проверки, содержит ли кортеж заданное значение.

Также возможно добавить один кортеж к другому с помощью методаadd():

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

Обратите внимание на использование методаcontainsAll(). Он вернетtrue, если все элементыpair1 присутствуют вquartet2.

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

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

В этом примереString добавляется в позицию 1, что затем проверяется методомindexOf(). Обратите внимание на разницу в порядке типов дляPair<String, Integer> иTriplet<String, String, Integer> после вызова методаaddAt1().

Мы также можем добавить несколько элементов, используя любой из методовadd() илиaddAtX():

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

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

Чтобы удалить элемент из кортежа, мы можем использовать методremoveFromX(). Опять же,X указывает отсчитываемую от нуля позицию удаляемого элемента:

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

assertThat(unit.contains(32));

8. Преобразование кортежей вList/Array

Мы уже видели, как преобразоватьList в кортеж. Давайте теперь посмотрим, как преобразовать кортеж вList:

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

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


Это довольно просто. Единственное, что здесь следует отметить, это то, что мы всегда будем получатьList<Object>,, даже если кортеж содержит элементы того же типа.

Наконец, давайте преобразуем кортеж в массив:

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

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

Достаточно ясно, что методtoArray() всегда возвращаетObject[].

9. Заключение

В этой статье мы изучили библиотеку javatuples и отметили ее простоту. Он обеспечивает элегантную семантику и действительно прост в использовании.

Обязательно ознакомьтесь с полным исходным кодом этой статьиover on GitHub. Полный исходный код содержит немного больше примеров, чем те, что описаны здесь. После прочтения этой статьи дополнительные примеры должны быть достаточно легкими для понимания.