Використання пар у Java

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.