1. Огляд
У цій короткій статті ми обговоримо дуже корисну концепцію програмування, відому як Pair . Пари забезпечують зручний спосіб обробки простого ключа до асоціації значень і особливо корисні, коли ми хочемо повернути два значення з методу.
Проста реалізація Pair доступна в основних бібліотеках Java. Окрім цього, деякі сторонні бібліотеки, такі як Apache Commons та Vavr, розкрили цю функціональність у своїх відповідних API.
2. Основна реалізація Java
2.1. пара Клас
Клас Pair можна знайти в пакунку javafx.util . Конструктор цього класу приймає два аргументи, ключ і відповідне йому значення:
Pair pair = new Pair(1, "One"); Integer key = pair.getKey(); String value = pair.getValue();
Цей приклад ілюструє просте відображення цілого числа до рядка за допомогою концепції Pair.
Як показано, ключ у об'єкті пари отримується шляхом виклику методу getKey (), тоді як значення отримується за допомогою виклику getValue ().
2.2. AbstractMap.SimpleEntry та AbstractMap.SimpleImmutableEntry
SimpleEntry визначається як вкладений клас всередині класу AbstractMap . Для створення об'єкта такого типу ми можемо надати ключ і значення конструктору:
AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry(1, "one"); Integer key = entry.getKey(); String value = entry.getValue();
До ключа та значення можна отримати доступ за допомогою стандартних методів отримання та встановлення.
Крім того, клас AbstractMap також містить вкладений клас, який представляє незмінну пару: клас SimpleImmutableEntry :
AbstractMap.SimpleImmutableEntry entry = new AbstractMap.SimpleImmutableEntry(1, "one");
Це працює подібно до змінного класу пари, за винятком того, що значення пари не може бути змінено. Спроба зробити це призведе до UnsupportedOperationException .
3. Apache Commons
У бібліотеці Apache Commons ми можемо знайти клас Pair у пакеті org.apache.commons.lang3.tuple . Це абстрактний клас, тому його неможливо створити безпосередньо.
Тут ми можемо знайти два підкласи, що представляють незмінні та змінні пари: Imm utablePair та MutablePair.
Обидві реалізації мають доступ до методів отримання / значення ключа / значення:
ImmutablePair pair = new ImmutablePair(2, "Two"); Integer key = pair.getKey(); String value = pair.getValue();
Не дивно, що спроба викликати setValue () на ImmutablePair призводить до UnsupportedOperationException.
Але операція цілком придатна для змінної реалізації:
Pair pair = new MutablePair(3, "Three"); pair.setValue("New Three");
4. Вавр
У бібліотеці Vavr функціональність пари забезпечується незмінним класом Tuple2 :
Tuple2 pair = new Tuple2(4, "Four"); Integer key = pair._1(); String value = pair._2();
У цій реалізації ми не можемо змінити об'єкт після створення, тому мутують методи повертають новий екземпляр, що включає передбачені зміни:
tuplePair = pair.update2("New Four");
5. Альтернатива I - Простий клас контейнера
Або за бажанням користувача, або за відсутності будь-якої з вищезазначених бібліотек, стандартним обхідним рішенням для функціонування пари є створення простого класу контейнера, який обертає бажані повернені значення.
Найбільшою перевагою тут є можливість надати наше ім’я, що допомагає уникнути того, щоб один і той же клас представляв різні об’єкти домену:
public class CustomPair { private String key; private String value; // standard getters and setters }
6. Альтернатива II - масиви
Іншим поширеним обхідним шляхом є використання простого масиву з двома елементами для досягнення подібних результатів:
private Object[] getPair() { // ... return new Object[] {key, value}; }
Зазвичай ключ знаходиться в нульовому індексі масиву, тоді як його відповідне значення - в індексі один.
7. Висновок
У цьому підручнику ми обговорили концепцію пар у Java та різні реалізації, доступні в основній Java, а також інших сторонніх бібліотеках.
Як завжди, ви можете знайти код, що підтримує цей підручник, на GitHub.