ОНОВЛЕННЯ: Ця відповідь відповідає на оригінальне запитання, чи є у Java SE 8 пари чи кортежі? (І неявно, якщо ні, то чому б ні?) ОП оновило питання більш повним прикладом, але, здається, воно може бути вирішене без використання якоїсь структури пари. [Примітка від ОП: ось інша правильна відповідь .]
Коротка відповідь - ні. Вам або доведеться запустити свою власну або внести одну з декількох бібліотек, які її реалізують.
Навчання Pair
в Java SE було запропоновано та відхилено хоча б один раз. Дивіться цю тему для обговорення в одному зі списків розсилки OpenJDK. Компроміси не очевидні. З одного боку, є багато реалізацій пари в інших бібліотеках та в коді програми. Це демонструє потребу, і додавання такого класу до Java SE збільшить повторне використання та обмін. З іншого боку, наявність класу Pair додає спокусі створити складні структури даних з пар та колекцій без створення необхідних типів та абстракцій. (Це парафраза повідомлення Кевіна Бурліона з цієї теми .)
Я рекомендую всім прочитати цілу нитку електронної пошти. Він надзвичайно проникливий і не має полум'я. Це досить переконливо. Коли це почалося, я подумав: "Так, у Java SE повинен бути клас пари", але до того моменту, як нитка досягла свого кінця, я передумав.
Зауважте, що JavaFX має клас javafx.util.Pair . API JavaFX еволюціонували окремо від API Java SE.
Як видно із пов'язаного питання Що таке еквівалент пари C ++ на Java? існує досить великий простір дизайну, що оточує те, що, мабуть, такий простий API. Чи повинні об'єкти бути незмінними? Чи повинні вони бути серійними? Чи повинні вони бути порівнянними? Чи повинен бути клас остаточним чи ні? Чи слід замовляти два елементи? Це повинен бути інтерфейс чи клас? Навіщо зупинятися на парах? Чому б не трійки, квадроцикли чи N-кортежі?
І звичайно, існує неминуче називання велосипедів для елементів:
- (а, б)
- (перша секунда)
- (ліво право)
- (машина, компакт-диск)
- (колонтитул, бар)
- тощо.
Одне велике питання, яке майже не згадується, - це відношення Парів до примітивів. Якщо у вас є (int x, int y)
дата, яка представляє собою точку в двовимірному просторі, представляючи це як Pair<Integer, Integer>
споживає три об'єкти замість двох 32-бітних слів. Крім того, ці об'єкти повинні знаходитися на купі і матимуть накладні витрати GC.
Здавалося б, зрозуміло, що, як і потоки, важливо, щоб існували примітивні спеціалізації для пар. Ми хочемо побачити:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Навіть IntIntPair
знадобиться один об’єкт на купі.
Вони, звичайно, нагадують про розповсюдження функціональних інтерфейсів у java.util.function
пакеті Java SE 8. Якщо ви не хочете роздутого API, які з них ви б залишили? Ви також можете стверджувати, що цього недостатньо, і спеціалізації для, скажімо, Boolean
слід також додати.
Я відчуваю, що якби Java давно додала клас пари, це було б просто або навіть спрощено, і це не задовольнило б багатьох випадків використання, які ми зараз передбачаємо. Подумайте, що якби пара була додана у часові рамки JDK 1.0, вона, ймовірно, була б зміною! (Погляньте на java.util.Date.) Чи були б люди із цим задоволені? Я здогадуюсь, що якби на Java існував клас «Пара», це було б якось не так-то не дуже корисно, і всі все ще будуть прокручувати свої власні потреби, щоб задовольнити свої потреби, у зовнішніх бібліотеках були б різні реалізації Pair і Tuple, і люди все ще сперечаються / обговорюють питання про те, як виправити клас Java Pair. Іншими словами, наче там, де ми сьогодні.
Тим часом триває деяка робота над вирішенням фундаментального питання, а саме - кращою підтримкою в JVM (і, зрештою, мовою Java) для типів значень . Дивіться цей документ про стан цінностей . Це попередня, спекулятивна робота, і вона охоплює лише питання з точки зору JVM, але вона вже має досить багато думок. Звичайно, немає гарантій, що це потрапить у Java 9 або коли-небудь потрапить куди завгодно, але це дійсно показує поточний напрямок мислення на цю тему.
AbstractMap.SimpleImmutableEntry<K,V>
протягом багатьох років ... Але в будь-якому випадку, замість відображення ,i
щоб(i, value[i])
тільки для фільтрації поvalue[i]
і відображенню назадi
: чому не тільки фільтр,value[i]
в першу чергу, без відображення?