Вступ до Javatuples

1. Огляд

Кортеж - це сукупність кількох елементів, які можуть бути пов’язані між собою, а можуть і не. Іншими словами, кортежі можна вважати анонімними об'єктами.

Наприклад, [“RAM”, 16, “Astra”] - це кортеж, що містить три елементи.

У цій статті ми коротко ознайомимося з дійсно простою бібліотекою, яка дозволяє нам працювати з кортежними структурами даних, названими javatuples .

2. Вбудовані класи Javatuples

Ця бібліотека надає нам десять різних класів, яких би вистачило більшості наших вимог щодо кортежів:

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

На додаток до класів вище, є два додаткові класи, KeyValue та LabelValue , які надають функціональні можливості, подібні до Pair , але відрізняються за семантикою.

Відповідно до офіційного сайту, усі класи в javatuples є безпечними та незмінними . Кожен з класу кортежу реалізує ітерацію , Serializable і Порівнянний інтерфейс.

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

Зверніть увагу, що кількість предметів у колекції має відповідати типу кортежу, який ми хочемо створити . Наприклад, ми не можемо створити квінтет, використовуючи наведену вище колекцію, оскільки для цього потрібні рівно п’ять елементів. Те саме стосується будь-якого іншого класу кортежів, що має вищий порядок, ніж квінтет .

Однак ми можемо створити кортеж нижчого порядку, такий як 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);

Як бачимо, позиція « Джон » дорівнює нулю, « 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. Встановлення значень для кортежів

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